URL: https://www.overclockers.at/coding-stuff/sql_select_where_x_in_all_182206/page_1 - zur Vollversion wechseln!
Hallo allerseits, ich habe folgendes Problem mit einem SQL Query:
Datenbank: HSQLDB
tabelle NodesToTags sieht etwa so aus:
Code:NodesToTags ---------------- NodeId | TagId ---------------- 0 | 0 0 | 1 0 | 3 0 | 4 7 | 3 7 | 4 7 | 22 ...etc
Code:SELECT cnt.nodeid FROM nodestotags LEFT OUTER JOIN (SELECT count(*) as cn, nodeid FROM nodestotags WHERE TagId IN(0,4) GROUP BY nodeid) as cnt ON (cnt.nodeid=nodestotags.nodeid) WHERE TagId IN(6,14,19) AND cn = (SELECT count(*) FROM (SELECT DISTINCT tagid FROM nodestotags WHERE tagid IN(0,4))) GROUP BY cnt.nodeid
hmm, werds vielleicht später genauer ansehen, aber müsst das nicht mit "having" gehen.
also ica du hattest ein ähnliches problem hier:
http://www.overclockers.at/include_...ighlight=select
aber bei uns kann die liste eben (leider) beliebig lang werden und ist nicht auf 2 gemeinsamkeiten beschränkt.
das zugrundeliegende problem: IN ist eine oder verknüpfung.
wir bräuchten aber eben eine UND verknüpfung für alle elemente einer liste.
was aber aufgrund der tupelorientierung von sql ja gar nicht gehen kann so wie ich das sehe.
einzige alternative: aufgrund der liste den query komplett dynamisch aufbauen im Programmcode.
Aber das muss doch auch in sql irgendwie "einfach" zu realisieren sein.
achso ich hab das glaub ich falsch verstanden. versteh ich das jetzt richtig, dass du 2 tagids gegeben hast und damit in diese join-tabelle gehst und nodes suchst die zu diesen beiden tags gehören?
eine idee:
SELECT nodeid, count() as count FROM table GROUP by nodeid Where id in () AND count =<anzahl der gewünschten nodeids>
wenn dann so
SELECT *, count(tagid) as counter FROM nodestotags WHERE tagid in (1,4) GROUP by nodeid HAVING counter > 1
ja, so auswendig kenn ich die genaue syntaxordnung nicht.
aber, nicht counter > 1 sondern counter=<anzahl der gewünschten tagid's> also in unserem fall counter=2
jo gut, dachte es geht immer um 2 und > 1 ist nunmal auch 2
@ ica, kleinerChemiker
also
SELECT *, count(tagid) as counter FROM nodestotags WHERE tagid in (1,4) GROUP by nodeid HAVING counter = 2;
geht mal gar nicht, weil man nichts selektieren kann, was nicht in der group by clause ist.
SELECT nodeid, count(tagid) as counter FROM nodestotags WHERE tagid in (1,4) GROUP by nodeid HAVING counter = 2;
liefert:
java.sql.SQLException:
NULL value as BOOLEAN / Error Code: -106 / State: S1000
ok lösung:
HSQLDB kann KEINE alias für funktionsergebnisse und/oder in der having clause... ->
SELECT nodeid, count(tagid) FROM nodestotags WHERE tagid in (1,4) GROUP by nodeid HAVING [/b]count(tagid)[/b] = 2;
-> SOLVED
Danke für die antworten
mit mysql gehts
zu hsqldb kann ich nichts sagen weil ichs noch nie gehört hab.
http://www.hsqldb.org/
ist ganz nett für kleinere Projekte, weil es in-memory in der runtime der application laufen kann -> User braucht keine stand-alone Datenbank aufsetzen.
geht auch im Server-Mode für größere Projekte aber dazu kann ich nicht viel sagen.
ah, sowas also. kenne in diesem zusammenhang eigentlich nur sqlite.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025