brauche krasses Statement
Cruz
- datenbank
Hallo Leute,
ich komme nicht drauf. Ich habe 2 Tabellen, eine mit Applikationen, eine mit Bugs. Die Bugs sind per Bug.Application_id den Applikationen zugeordnet. Ich brauche alle Applikationen, die NICHT den Bug Nr. 1 haben. Das sind natürlich auch alle Applikationen, die gar keinen Bug haben. Meine Annäherung soweit:
SELECT Application.*
FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
WHERE (Bug.id IS NULL OR Bug.id <> 1)
Das Problem ist, wenn eine Application sowohl Bug 1 als auch Bug 2 hat, dann steht er trotzdem noch in der Liste. Wie komme ich weiter?
Danke,
Cruz
Ach so..subqueries sind nicht erlaubt...sonst wäre es ja einfach. :)
N'Abend,
ich hätte da nur einen verrückten Versuch, obs gut ist oder überhaupt klappt weiß ich nicht:
SELECT Application.id, MIN(Bug.id) AS bugs
FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
GROUP BY application.id
HAVING bugs = NULL OR bugs > 1
Klappt aber nur für die 1, ansonsten wirds böse.
MfG
Rouven
Das mit der 1 war nur beispielsweise gemeint. Ich möchte schon eine beliebige Bugnummer angeben können. Aber trotzdem danke!
*Grübel*
also wenn es hier nur um die Subquery-unfähige MySQL-Datenbank geht, dann könntest du deren GROUP-BY-Toleranz ausnutzen: In MySQL darfst du auch nicht aggregierte Werte nach einem group-by abfragen, d.h. du könntest mal probieren was
SELECT Application.id, Bug.id
FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
GROUP BY application.id
HAVING Bug.id <> 1
rausbringt.
MfG
Rouven
Hallo
also wenn es hier nur um die Subquery-unfähige MySQL-Datenbank geht, dann könntest du deren GROUP-BY-Toleranz ausnutzen: In MySQL darfst du auch nicht aggregierte Werte nach einem group-by abfragen, d.h. du könntest mal probieren was
und unvorhersehbare Resultate bekommen, wie die MySQL-Doku besagt, siehe auch mein Posting in einem anderen Thread :-)
Na, wenn das nicht zu Bugs passt. *bg*
Ist kein Upgrade von MySQL möglich? Neuere Versionen haben doch einiges an Funktionalität hinzugewonnen.
Freundliche Grüße
Vinzenz
Ist kein Upgrade von MySQL möglich? Neuere Versionen haben doch einiges an Funktionalität hinzugewonnen.
Leider ist das nicht drin. Z.z. habe ich das mit 2 Queries und einer scriptseitigen Logik gelöst. Irgendjemand meinte mal, dass man jede Subquery mit JOINs umschreiben kann, aber dieses Beispiel scheint es tatsächlich zu wiederlegen. Ich kann mir nicht vorstellen, wie diese Aufgabe einfach durch Auswahl aus einem kartesischem Produkt zu realisieren ist.
Ich nochmal,
hab doch noch was gegrübelt:
SELECT Application.id
FROM Application INNER JOIN Bug ON Application.id = Bug.Application_id AND Bug.id = 1
Das hier liefert ja alle diejenigen App-IDs, die einen Bug 1 haben. Na ja, gut, joinen wir halt mit denen jetzt erneut in die App-Tabelle und fordern kein Ergebnis:
SELECT app_ziel.*, app_filter.id AS testid
FROM
Application app_filter
INNER JOIN Bug ON app_filter.id = Bug.Application_id AND Bug.id = 1
LEFT JOIN Application app_ziel
ON app_filter.id = app_ziel.id
WHERE testid IS NULL
MfG
Rouven
Hi!
klappt leider so nicht, es gibt nur einen empty set. Aber ist ein guter Ansatz, ich brüte gerade dran.
Gruß,
Cruz
SELECT app_ziel.*, app_filter.id AS testid
FROM
Application app_filter
INNER JOIN Bug ON app_filter.id = Bug.Application_id AND Bug.id = 1LEFT JOIN Application app_ziel
ON app_filter.id = app_ziel.id
WHERE testid IS NULL
Boa eh krass eh..
Hi Crass, äh, Cruz
select application.name from application where application.application_id not in (select bug.application_id from bug where bug.bug_nr=1);
Gruß
Hans
Hi,
ich glaube das fällt unter die Kategorie "benutzt Subselect" und war nicht gewünscht.
MfG
Rouven
yo,
SELECT Application.*, MIN(IF(bug.id = 1, 0, 1)) AS Check
FROM Application
LEFT JOIN Bug
ON Application.id = Bug.Application_id
GROUP BY Application.*
HAVING MIN(CHECK) = 1
Ilja