[MYSQL] unieke nummers uit meerdere kolommen

Pagina: 1
Acties:

  • Anders
  • Registratie: December 2000
  • Laatst online: 24-08 18:29
Ik heb de volgende tabel:

Afbeeldingslocatie: http://www.inpact.nl/testflash/tabel.gif

en ben op zoek naar 1 query waarmee ik alle unieke disc_id's kan opvragen. Dus als het ware een soort

SELECT DISTINCT(disc1_id, disc2_id, disc3_id) as unique_id FROM...

Da's een complete kul-query natuurlijk maar het gaat even om de gedachte die erachter zit. Ik kan natuurlijk wel "SELECT disc1_id, disc2_id, disc3_id FROM.." doen en dan wat PHP erop loslaten (array_unique etc) maar ik was benieuwd of het het mogelijk was om het in de query op te lossen.

(ja, een koppeltabel was wellicht beter geweest maar dat betekent in het huidige stadium een te radicale ombouw van de code)

Ik spoor veilig of ik spoor niet.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

uhm die ombouw is denk ik zowieso een heeeeeeeeeel goed plan als dit ergens in produktie gaat
</understatement>

Doet iets met Cloud (MS/IBM)


  • momania
  • Registratie: Mei 2000
  • Laatst online: 27-08 21:06

momania

iPhone 30! Bam!

Je zou het met een UNION kunnen doen (als MySql dan kent??), is niet echt mooi maar ja:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT distinct
   disc1_id   as ID,
   1            as indentifier
from
   tabel

UNION

SELECT distinct
   disc2_id   as ID,
   2            as indentifier
from
   tabel

UNION

SELECT distinct
   disc3_id   as ID,
   3            as indentifier
from
   tabel


Zo zou je 1 lange lijst krijgen met al je unieke id's per disc en die kan je dan in je php met
de indentifier scheiden...

Zoals ik al zei: 't is niet mooi, maar is maar een suggestie ;)

Neem je whisky mee, is het te weinig... *zucht*


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Dit gaat echt nooit werken. D2k noemt het een understatement maar ... Als dit Idols was geweest, en ik in de jury had gezeten, dan ........

Disk moet naar een aparte tabel (met jaar daarin opgenomen)
Kunstenaar een aparte tabel en lekker daartussen in een relatietabel.

Niet eens proberen op te lossen met een ingewikkelde query, want dit gaat je voortdurend blijven opbreken. Bijv al bij de eerste beste kunstenaar die 4 disk's uitbrengt.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Goodielover schreef op 18 November 2002 @ 12:20:
Dit gaat echt nooit werken. D2k noemt het een understatement maar ... Als dit Idols was geweest, en ik in de jury had gezeten, dan ........

:D
ik had het idd misschien beter tot de grond toe kunnen affikken, tis waardeloos en dient direct bij het grofvuil te worden gezet. kortom: als je het voor je hobby doet, pruts lekker verder, als je het `professioneel' zo doet, please verander van baan

Doet iets met Cloud (MS/IBM)


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Thats Idols-like :)

Gaat hij nu :'( ?

  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
Om unieke waarden uit te lezen:
SELECT fieldname, COUNT(*) AS Occurence
FROM tablename
GROUP BY fieldname
HAVING COUNT(*) = 1

Maar hoe je dit moet vertalen naar jouw situatie moet je zelf maar even uitzoeken :)
Dit is alleen om 1 kolom te onderzoeken op unieke waarden.

Fuck me if I'm wrong, but isn't your name Gretchen?


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Niets uitdoen op gequote post. Dit klopt niet!
Is niet van toepassing op jouw probleem!

Voor het genoemde probleem is het ook nog niet eens de oplossing want dan had er in de having clause ">1" moeten staan.
Theguide schreef op 18 november 2002 @ 14:35:
Om unieke waarden uit te lezen:
SELECT fieldname, COUNT(*) AS Occurence
FROM tablename
GROUP BY fieldname
HAVING COUNT(*) = 1

Maar hoe je dit moet vertalen naar jouw situatie moet je zelf maar even uitzoeken :)
Dit is alleen om 1 kolom te onderzoeken op unieke waarden.

  • Anders
  • Registratie: December 2000
  • Laatst online: 24-08 18:29
Goodielover schreef op 18 November 2002 @ 12:20:
Dit gaat echt nooit werken. D2k noemt het een understatement maar ... Als dit Idols was geweest, en ik in de jury had gezeten, dan ........

Disk moet naar een aparte tabel (met jaar daarin opgenomen)
Kunstenaar een aparte tabel en lekker daartussen in een relatietabel.

Niet eens proberen op te lossen met een ingewikkelde query, want dit gaat je voortdurend blijven opbreken. Bijv al bij de eerste beste kunstenaar die 4 disk's uitbrengt.
Allemachtig, kan die arrogantie wat minder, mensen? Ik kan me af en toe wel voorstellen waarom aan de meeste programmeurs weinig sociale vaardigheden worden toegedicht als ik de reacties hier weer zo lees.


disc = discipline.

Het gaat om een jaarlijks terugkerend evenement, waarbij voor elk jaar deelnemers gekozen kunnen worden uit een lijst met kunstenaars, en waarbij elke deelnemer 3 disciplines dient op te geven aan de organisatie (bv. beeld, geluid, mime, fotografie etc). Dat opgeven van de 3 disciplines geschiedt per jaar: een kunstenaar kan in verschillende jaren van deelneming, verschillende disciplines opgeven.

Aan de klant is uiteraard gevraagd of kunstenaars in deze, of in toekomstige edities, meer of minder dan 3 disciplines per jaar op moesten konden geven, waarop ontkennend werd geantwoord. In het CMS waarmee de betreffende site werkt, was de bovenstaande oplossing (3 vaste kolommen met verwijzingen naar de disciplines) in korte tijd te implementeren, terwijl een tussentabel aanzienlijk meer werk zou vergen. Een kosten-baten-kwestie dus, en in overleg met de klant (en na uitleg van de voor- en nadelen) is besloten het op te lossen zoals nu gedaan is.

Dus misschien zouden sommigen hier eens wat minder kortzichtig en hautain moeten zijn en niet zo snel moeten oordelen. Want, goodielover, jouw voorstel om de disciplines in een tabel te koppelen aan een jaar, slaat bijvoorbeeld helemaal nergens op. Als ik in de jury van Idols zat, dan...


Momania, thanks, maar helaas is UNION pas geïmplementeerd in MySQL 4.0.0, en die is nog in alpha
Voor het genoemde probleem is het ook nog niet eens de oplossing want dan had er in de having clause ">1" moeten staan
>0 toch?
Maar het aantal occurences hoef ik niet eens te hebben dus een SELECT DISTINCT(disc1_id) FROM table zou voor die ene kolom al voldoende zijn.

Ik spoor veilig of ik spoor niet.


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je geeft nu wel ik één keer veel meer info. Ik begin het te snappen.

Hierbij mij idee voor de oplossing:
Ga uit van de tabel met disciplines en join daarbij via de where-clause (dus niet met een JOIN in de from) d.disc_id in (t.disc1_id, t.disc2_id, t.disc3_id)
dan kan je wel een select distinct gebruiken op de de tabel disciplines.

Heb ik het weer een beetje goed gemaakt.
Je moet toch toegeven dat het ontwerp vragen oproept, zeker als je niet ook de context geeft.
Je zat na onze/mijn reactie dus niet zozeer te :'( alswel eerder te :r

Succes verder.

PS als je de niet-unieke waarden wilt weten, wil je dus alle ID's met een count van meer dan 1. Alles met 1 is uniek.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

je kunt toch gewoon een

GROUP BY disc1_id, disc2_id, disc3_id

doen? Dat zou je de unieke combinaties als groups moeten geven als ik het niet compleet verloren ben :P

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Bosmonster schreef op 18 November 2002 @ 17:24:
je kunt toch gewoon een

GROUP BY disc1_id, disc2_id, disc3_id

doen? Dat zou je de unieke combinaties als groups moeten geven als ik het niet compleet verloren ben :P
Dan krijg je hetzelfde als een normale distinct in de select en dat gaat niet zijn vraag oplossen

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

Goodielover schreef op 18 november 2002 @ 17:25:
[...]

Dan krijg je hetzelfde als een normale distinct in de select en dat gaat niet zijn vraag oplossen


Misschien had ik die tweede lap tekst ook moeten lezen... :P

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Anders › Ik begrijp eerlijk gezegd nog steeds niet wat je nou precies wilt :?

Zou bijvoorbeeld:
code:
1
2
1   2   3 
4   5   6

een goede resultset zijn?
Of zou
code:
1
2
1   2   3
1   2   4

ook een goede zijn? Of niet? En waarom?

:)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Gegeven dit lijstje dat hij zelf in de eerste post geeft wil hij volgens mij hebben: alle verschillende waarden voor disciplines die voorkomen in één van de drie kolommen.
In dit geval:
1,2,4,6,7,10,11,12,13,16,17,18

Verwijderd

Dat kan dus alleen met een UNION afaik. Overigens is het wel prettig dat er nu wat meer data bijstaat! Dacht ook al aan cd'tjes...

  • Anders
  • Registratie: December 2000
  • Laatst online: 24-08 18:29
Sorry voor de late reply, ik had het volgende gisteren al geschreven maar moest de trein halen en had geen tijd om te posten:
-------
Goodielover schreef op 18 November 2002 @ 17:22:
Je geeft nu wel ik één keer veel meer info. Ik begin het te snappen.

Hierbij mij idee voor de oplossing:
Ga uit van de tabel met disciplines en join daarbij via de where-clause (dus
niet met een JOIN in de from) d.disc_id in (t.disc1_id, t.disc2_id,
t.disc3_id)
dan kan je wel een select distinct gebruiken op de de tabel disciplines.

Heb ik het weer een beetje goed gemaakt.
Yeps :)

SELECT DISTINCT(d.id) FROM editie as e, disciplines as d WHERE d.id in
(e.disc1_id, e.disc2_id, e.disc3_id)

Dat is 'm helemaal, thanks a lot.
Je moet toch toegeven dat het ontwerp vragen oproept, zeker als je
niet ook de context geeft.
Geef ik inderdaad toe.

Maar jij moet ook weer toegeven dat die informatie niet van belang was voor
de vraag, namelijk of zo'n query in ene mogelijk was.

En als het dan toch over prutswerk en hobbyisme vs. professionalisme gaat
(dan heb ik het met name tegen D2k), analytisch denkvermogen - ook een
belangrijke eigenschap van een programmeur - betekent niet alleen dat je
moet kunnen zien waar iets voor verbetering vatbaar is, maar ook dat je een
probleem kunt oplossen zonder dat je overbodige informatie hebt.
Gegeven dit lijstje dat hij zelf in de eerste post geeft wil hij volgens mij hebben: alle verschillende waarden voor disciplines die voorkomen in één van de drie kolommen.
In dit geval:
1,2,4,6,7,10,11,12,13,16,17,18
Inderdaad, en de bovenstaande query bereikt dat zonder union

Thanks all!

Ik spoor veilig of ik spoor niet.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Anders schreef op 19 november 2002 @ 21:19:
[..]maar ook dat je een probleem kunt oplossen zonder dat je overbodige informatie hebt.

De vraag is natuurlijk wel of iets overbodige informatie genoemd kan worden als een probleem met die informatie sneller opgelost wordt ;)
</offtopic:flauw>

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1