Filter unieke records (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
(Nieuwe pagina aangemaakt met 'Voorbeeld: <pre> drop table if exists tmp; create table tmp select tool_id, count(tool_id) as teller from main_tmp group by tool_id -- Om een of ande...')
 
 
(11 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
Voorbeeld:
+
== Wat bedoel je: Dubbelen uitfilteren, of unieke records uitfilteren? ==
 +
 
 +
Subtiel doch belangrijk verschil! Misschien bedoel ik [[Duplicate records (MySQL)]]?
 +
 
 +
== Voorbeeld: Is dit wat je bedoelt? ==
 +
 
 +
Deze query selecteert alle records die meer dan één keer voorkomen: Dat is meestal ''niet'' wat ik zoek ;)
 +
 
 +
<pre>
 +
select sku, count(sku) from root
 +
group by sku having count(sku)>1
 +
</pre>
 +
 
 +
== Voorbeeld: Bijna goed en dus precies fout ==
 +
 
 +
Deze query kopiëert alleen de records die maar één keer voorkomen. Dat was achteraf gezien niet wat ik zocht: Ik wil alle records maar één keer overnemen!
  
 
<pre>
 
<pre>
Regel 12: Regel 27:
 
from main_tmp  
 
from main_tmp  
 
group by tool_id    -- Om een of andere reden is 'group by' noodzakelijk
 
group by tool_id    -- Om een of andere reden is 'group by' noodzakelijk
having teller = 1; -- 'where' werkt niet. 'having' wel</pre>
+
having teller = 1; -- 'where' werkt niet. 'having' wel
 
</pre>
 
</pre>
 +
[[Media:Voorbeeld.ogg]]
 +
 +
== DISTINCT ==
 +
 +
Met het keyword <code>distinct</code> kun je unieke waardes filteren. Het probleem is echter, dat je alleen maar die éne kolom kunt tonen (of zoiets). Dus net niet handig, tenzij het een toekomstige primaire sleutel betreft [http://stackoverflow.com/questions/8571902/mysql-select-only-unique-values-from-a-column]
 +
 +
== Kopiëer naar nieuwe tabel met IGNORE + PK ==
 +
 +
Wat ik in de praktijk meestal doe:
 +
 +
* Defineer een gelijkvormige tabel
 +
* Maak van de betreffende kolom de PK
 +
* Kopiëer alle records naar die nieuwe tabel, met <code>SELECT IGNORE</code>. Klaar!
 +
 +
== Bronnen ==
 +
 +
* http://stackoverflow.com/questions/854128/find-duplicate-records-in-mysql
 +
* http://stackoverflow.com/questions/8571902/mysql-select-only-unique-values-from-a-column

Huidige versie van 9 aug 2018 om 16:51

Wat bedoel je: Dubbelen uitfilteren, of unieke records uitfilteren?

Subtiel doch belangrijk verschil! Misschien bedoel ik Duplicate records (MySQL)?

Voorbeeld: Is dit wat je bedoelt?

Deze query selecteert alle records die meer dan één keer voorkomen: Dat is meestal niet wat ik zoek ;)

select sku, count(sku) from root
group by sku having count(sku)>1

Voorbeeld: Bijna goed en dus precies fout

Deze query kopiëert alleen de records die maar één keer voorkomen. Dat was achteraf gezien niet wat ik zocht: Ik wil alle records maar één keer overnemen!

drop table if exists tmp;

create table tmp
select 

	tool_id, 
	count(tool_id) as teller 

from main_tmp 
group by tool_id     	-- Om een of andere reden is 'group by' noodzakelijk
having teller = 1;	-- 'where' werkt niet. 'having' wel

Media:Voorbeeld.ogg

DISTINCT

Met het keyword distinct kun je unieke waardes filteren. Het probleem is echter, dat je alleen maar die éne kolom kunt tonen (of zoiets). Dus net niet handig, tenzij het een toekomstige primaire sleutel betreft [1]

Kopiëer naar nieuwe tabel met IGNORE + PK

Wat ik in de praktijk meestal doe:

  • Defineer een gelijkvormige tabel
  • Maak van de betreffende kolom de PK
  • Kopiëer alle records naar die nieuwe tabel, met SELECT IGNORE. Klaar!

Bronnen