[SQL] Select ... where x in all ()

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sql_select_where_x_in_all_182206/page_1 - zur Vollversion wechseln!


Mr. Zet schrieb am 10.07.2007 um 17:47

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

jetzt will ich davon alle selektieren, die 1 bis n tagIds gemeinsam haben
also zum beispiel habe ich die tags mit id 1 und id 4 also sollte ich nur nodeid 0 bekommen, weil nur dieser node mit beiden tags assoziiert ist.

watchout hätte folgende lösung dafür, die ähem etwas komplex ist :D
außerdem in unserer anwendung wäre das ganze auch noch ein subquery eines komplexeren querys, was die sache dann total unübersichtlich macht :(

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


daher: alternativen wären sehr hilfreich.

Danke im voraus, Zet & watchout



EDIT: falls jemand den (langen) post vor dem edit gelesen hat: sorry ich hab den bullshit gelöscht der gar keinen sinn ergeben kann :rolleyes:
bin manchmal etwas langsam von begriff ;)


ica schrieb am 10.07.2007 um 17:56

hmm, werds vielleicht später genauer ansehen, aber müsst das nicht mit "having" gehen.


Mr. Zet schrieb am 10.07.2007 um 18:00

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.


ica schrieb am 10.07.2007 um 18:25

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?


kleinerChemiker schrieb am 10.07.2007 um 18:30

eine idee:

SELECT nodeid, count() as count FROM table GROUP by nodeid Where id in () AND count =<anzahl der gewünschten nodeids>


ica schrieb am 10.07.2007 um 18:39

wenn dann so

SELECT *, count(tagid) as counter FROM nodestotags WHERE tagid in (1,4) GROUP by nodeid HAVING counter > 1


kleinerChemiker schrieb am 10.07.2007 um 18:47

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


ica schrieb am 10.07.2007 um 18:49

jo gut, dachte es geht immer um 2 und > 1 ist nunmal auch 2 :)


Mr. Zet schrieb am 10.07.2007 um 19:17

@ 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


Mr. Zet schrieb am 10.07.2007 um 19:22

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 :)


ica schrieb am 10.07.2007 um 19:22

mit mysql gehts :)

zu hsqldb kann ich nichts sagen weil ichs noch nie gehört hab.


Mr. Zet schrieb am 10.07.2007 um 19:26

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.


ica schrieb am 10.07.2007 um 22:00

ah, sowas also. kenne in diesem zusammenhang eigentlich nur sqlite.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025