Problem mit JOINS

proloser

Erfahrenes Mitglied
Hallo,

meine Datenbank sieht so aus:

Tabelle 1:
id | Name | zahl

Tabelle 2:
id | tabelle1_id | zahl


Beispiel 1:
Tabelle 1:
1 | Test | 10

Tabelle 2:
1 | 1 | 4
1 | 1 | 5

Test wird ausgegeben, weil die Summe der zahlen kleiner 10 ist.


Beispiel 2:
Tabelle 1:
1 | Test | 10

Tabelle 2:
1 | 1 | 6
1 | 1 | 9

Test wird NICHT ausgegeben, weil die Summe der zahlen größer 10 ist.


Um das um zu setzen habe ich folgedes versucht:

Code:
SELECT 
  a.*, b.*

FROM 
  Tabelle1 a
  
LEFT JOIN 
  Tabelle2 b 
ON  
  a.id = b.tabelle1_id
  
GROUP BY 
  a.id   

HAVING
  SUM(b.zahl) < a.zahl

Was mach ich falsch?


proloser
 
Zuletzt bearbeitet:
Du kannst im HAVING nicht eine Group-Funktion (also SUM()) mit einem nicht grupierten Wert vergleichen

Eine Möglichkeit ist mit einem Subquery
SQL:
SELECT a. * , b. *
FROM Tabelle1 AS a, (

SELECT tabelle1_id, SUM( zahl ) AS sum
FROM Tabelle2
GROUP BY tabelle1_id
) AS b
WHERE a.id = b.tabelle1_id
AND b.sum < a.zahl
 
Zuletzt bearbeitet von einem Moderator:
Ok, so funktionierts eigentlich ganz gut aber ich möchte auch die Namen Anzeigen, wenn die Summe der Zahlen in der Tabelle 2 NULL ergibt bzw wenn für diesen Namen kein Eintrag in der Tabelle 2 ist.

Versucht hab ichs so, funktioniert aber nicht so wie ich mir das vorstelle:
SQL:
SELECT a. * , b. *
FROM Tabelle1 AS a, (

SELECT tabelle1_id, SUM( zahl ) AS sum
FROM Tabelle2
GROUP BY tabelle1_id
) AS b
WHERE 
b.tabelle1_id IS NULL 
OR
(a.id = b.tabelle1_id AND b.sum < a.zahl)
 
Zuletzt bearbeitet von einem Moderator:
LEFT JOIN ist da schon richtig

SQL:
SELECT
	a.*,
	b.*
FROM
	Tabelle1 AS a
	LEFT JOIN (SELECT
		tabelle1_id,
		SUM(zahl) AS sum
	FROM
		Tabelle2
	GROUP BY 
		tabelle1_id) AS b
	ON a.id = b.tabelle1_id
WHERE
	 b.sum < a.zahl
 
Zuletzt bearbeitet von einem Moderator:
Mit der WHERE Abfrage funktionits:

SQL:
WHERE
  b.sum IS NULL OR 
  b.sum < a.zahl

Noch eine andere Frage ... wenn eine SELECT Abfrage kein Datensatz findet, wird kein Wert zurück gegeben. Ist es möglich damit dann einfach 0 zurück gegeben wird?

Beispiel:
SQL:
zahl1 < zahl2 - (SELECT zahl FROM tabelle WHERE zahl < 10 LIMIT 1)

Hier hab ich das Problem, sobald im Subselect kein Datensatz gefunden wird funktioniert auch "zahl1 < zahl2" nicht. Wenn das Subselect einfach 0 zurück gibt, wäre das kein Problem.
 
Zuletzt bearbeitet von einem Moderator:
Wie ich geschrieben habe: LEFT JOIN
Der nimmt alles von der Haubttabelle, auch wenn er in der Untertabelle keinen Eintrag findet
 
Zurück