[MySQL] query selectie meerdere waardes, zelfde objectid

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • regtur2
  • Registratie: December 2008
  • Laatst online: 12-09 19:01
Ik heb de volgende tabel:

autoidobjectidveldidtypewaardeidwaarde
11115
21112
32112
43112
53115


Daarbij wil ik een query maken waarbij veldid = 1, typewaardeid = 1, waarde = 5 en waarde = 2. de records van objectid 1 en 3 getoond worden. object 2 kent wel 2 maar geen 5. Die moet in dit geval niet meegenomen worden.

De volgende query heb ik bedacht:
SELECT COUNT(`objectid`),`objectid` FROM `values` WHERE ((`veldid` = 1 AND `typewaardeid` = 1) AND `waarde` = 2 OR `waarde` = 700) GROUP BY `objectid` HAVING count = 2

Met deze query krijg ik uit bovenstaande tabel de juiste objectid's, als er echter een record zou zijn waarbij waarde = 2, 2x zou voorkomen (in theorie mogelijk), dan wordt die ook meegenomen. Al met al lijkt me de query zeer omslachtig en werkt die niet ideaal.

Het liefst zou ik een query willen die (ongeveer) als volgt werkt:
SELECT * FROM `values` WHERE ((`veldid` = 1 AND `typewaardeid` = 1) AND `waarde` = 2 AND `waarde` = 700)

Op die wijze kan ik makkelijk aan de query andere combinaties van veldid, typewaardeid en waarde meegeven.

Ik heb de faq bekijken. Volgens mij staat daar niet in wat ik zoek (voor zover ik het begreep).
Daarnaast heb ik gezocht op HAVING wat volgens mij ook geen oplossing kan bieden. Verder heb ik op algemene dingen gezocht zoals mysql where inside group by.

Is er een makkelijke oplossing?

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Een kolom kan nooit tegelijk 2 waardes hebben. Wat jij wilt is meerdere rijen filteren, en dan de unieke objectid's krijgen.

Ga eens aan de slag met DISTINCT en OR.

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 13-09 17:39

krvabo

MATERIALISE!

Volgens mij is dit ook op te lossen door de tabel met zichzelf te joinen, of als het beperkt blijft tot twee of drie waarden met een subquery (met dien verstande dat dit al snel traag -kan- zijn)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • regtur2
  • Registratie: December 2008
  • Laatst online: 12-09 19:01
Inmiddels ben ik met group_concat verder gekomen. http://fellowtuts.com/mys...field-using-group_concat/

SELECT objectid, veldid,datatypeid, GROUP_CONCAT(DISTINCT waarde ORDER BY waarde) AS 'valuelist' FROM values GROUP by objectid, veldid, datatypeid HAVING `valuelist` = '2,5' ORDER BY objectid

algemeen:
SELECT objectid, veldid,datatypeid, GROUP_CONCAT(DISTINCT waarde ORDER BY waarde) AS 'valuelist' FROM values GROUP by objectid, veldid, datatypeid ORDER BY objectid

Hier maak ik een view van zodat ik kolom valuelist kan gebruiken in WHERE.

Enige probleem is nog wel dat als ik wil zoeken op values 2 en 5, en een valuelist bestaat uit 2, 3 en 5, dat die lastiger te vinden is.

update:
Uiteindelijk gelukt om dat op te lossen.

SELECT * FROM `valuesgrouped` GROUP BY `objectid` HAVING (((`veldid` = 1 AND `datatypeid` = 1) AND `valuelist` REGEXP '(^|,)[2](,|$)'
AND `valuelist` REGEXP '(^|,)[3](,|$)'
AND `valuelist` REGEXP '(^|,)[7][0][0](,|$)') )

Helaas werkt het allemaal zo omslachtig en slecht dat ik maar gewoon aparte queries ga uitvoeren middels php.

Als iemand een makkelijke manier weet om het middels een eenvoudige query op te lossen, dan hoor ik het graag.

[ Voor 71% gewijzigd door regtur2 op 23-02-2015 18:49 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Met een JOIN op dezelfde tabel los je dit simpel op.

Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32

ajakkes

👑

Is dit de query die je zoekt?
Select records met objectid in (Select objectid's met waarde 5) en waarde 2?

Je moet hem dan zelf even vertalen.

👑


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Wat krvabo, en _js al zeggen: je kan dit oplossen door de tabel met zichzelf te joinen. Je hebt twee sets: records met waarde 2, en records met waarde 5. Je wil alle records die in beide sets zitten. Dit kan je doen door de twee sets te joinen.

De eerste set krijg je door:

SQL:
1
SELECT OBJECT_ID FROM table WHERE ... AND WAARDE=2


De tweede set ziet er precies zo uit, maar dan met WAARDE=5.

Gooi een join tussen deze twee selects, eventueel nog een DISTINCT, en presto.

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

Verwijderd

...
GROUP BY `objectid`
HAVING COUNT(DISTINCT Waarde) = 2

Acties:
  • 0 Henk 'm!

  • regtur2
  • Registratie: December 2008
  • Laatst online: 12-09 19:01
@ajakkes: ja dat is in dit geval de query die ik zoek, echter kan ik bijvoorbeeld 10-30 verschillende waardes zoeken. Dan worden het erg veel subqueries.

Iedereen bedankt voor de input. Ik ga in praktijk kijken welke oplossing het beste werkt: join of count zoals wirrtenfc84 aangeeft. Voorlopig denk ik de count optie en dan per veldid en typewaardeid laten uitvoeren. Vervolgens de objectids zoeken die overal voorkomen.
Pagina: 1