FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Har ett problem med att formulera en SQL-fråga. Jag vill få ut en lista med alla dubletter i min tabell, d.v.s. en slags "motsats" till DISTINCT.
Säg att jag har en tabell kunder som ser ut så här: Kod:
id fornamn efternamn adress telefon 1 Olle Karlsson ... ... 2 Pelle Nilsson ... ... 3 Kalle Nilsson ... ... 4 Olle Karlsson ... ... 5 Pelle Karlsson ... ... 6 Kalle Olsson ... ... 7 Kalle Nilsson ... ... 8 Olle Karlsson ... ... Jag kan komma på en fråga som denna Kod:
SELECT DISTINCT CONCAT(fornamn, " ", efternamn) AS namn, COUNT(*) AS antal FROM kunder GROUP BY namn HAVING antal > 1 Kod:
Olle Karlsson Kalle Nilsson Någon som har något tips? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
Kanske inte den snyggaste lösningen:
Kod:
SELECT * FROM kunder a, kunder b WHERE CONCAT(a.fornamn, " ", a.efternamn)=CONCAT(b.fornamn, " ",b.efternamn ) AND a.id!=b.id GROUP BY a.id |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
Oller, ditt förslag förstår jag inte... Det fungerar inte alls. Vad skulle följande betyda över huvud taget?
Kod:
SELECT * FROM kunder a, kunder b Kod:
SELECT DISTINCT CONCAT(fornamn, " ", efternamn) AS namn, COUNT(*) AS antal FROM kunder GROUP BY namn HAVING antal > 1 Kod:
SELECT * FROM kunder WHERE CONCAT(fornamn, " ", efternamn) = $namn Kod:
SELECT * FROM kunder WHERE CONCAT(fornamn, " ", efternamn) IN (SELECT DISTINCT CONCAT(fornamn, " ", efternamn) AS namn, COUNT(*) AS antal FROM kunder GROUP BY namn HAVING antal > 1) |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Det fungerar inte bara med
Kod:
SELECT * FROM kunder WHERE CONCAT(fornamn, " ", efternamn) IN (SELECT DISTINCT CONCAT(fornamn, " ", efternamn) AS namn FROM kunder GROUP BY namn HAVING COUNT(*) > 1) |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Slän på GROUP_CONCAT(id) AS ids så kommer du förhoppningsvis att få namnet + en lista med namnen.
Kod:
SELECT DISTINCT CONCAT(fornamn, \" \", efternamn) AS namn, GROUP_CONCAT(id) AS ids, COUNT(*) AS antal FROM kunder GROUP BY namn HAVING antal > 1 |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
WizKid, det verkar inte som om det funkar. Om det gör det tar det i alla fall längre tid än jag orkade vänta...
Grazzy, tack för ditt förslag! Jag kände inte till GROUP_CONCAT tidigare, men det var en intressant variant som absolut kan komma till användning! |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Medlem
|
Citat:
Kod:
SELECT * FROM kunder a, kunder b Frågan funkar för mig med följande data: Kod:
mysql> select version(); +-----------+ | version() | +-----------+ | 5.0.37 | +-----------+ 1 row in set (0.00 sec) mysql> describe kunder; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | fornamn | varchar(200) | NO | | | | | efternamn | varchar(200) | NO | | | | +-----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM kunder a, kunder b WHERE CONCAT(a.fornamn, " ", a.efternamn)=CONCAT(b.fornamn, " ",b.efternamn ) AND a.id!=b.id GROUP BY a.id ->; +----+---------+-----------+----+---------+-----------+ | id | fornamn | efternamn | id | fornamn | efternamn | +----+---------+-----------+----+---------+-----------+ | 1 | Olle | Karlsson | 4 | Olle | Karlsson | | 3 | Kalle | Nilsson | 7 | Kalle | Nilsson | | 4 | Olle | Karlsson | 1 | Olle | Karlsson | | 7 | Kalle | Nilsson | 3 | Kalle | Nilsson | | 8 | Olle | Karlsson | 1 | Olle | Karlsson | +----+---------+-----------+----+---------+-----------+ 5 rows in set (0.00 sec) |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
Se upp med den begränsning i längd som finns som standard i GROUP_CONCAT. Max längd sätts om standard till 1024 tecken om man inte ändrar i inställningarna. Räcker i och för sig till en hel del dubletter men om man vill använda GROUP_CONCAT till annat så bör man var medveten om denna begränsning.
|
||
![]() |
![]() |
Svara |
|
|