Das * ist ganz unschön und gefährlich bei einem GROUP BY
MySQL ist da etwas unseriös, da du nicht alle Felder im GROUP BY definieren musst, die Gruppiert werden. Mit dem * im SELECT gruppiert er alles was nicht mit einer Guppierungsfunktion versehen ist (Also SUM(), COUNT(), MAX() etc)
Nemen wir mal diese Tabelle
Code:
my_table:
id | feld1 | feld2 | feld13
---------------------------
1 | A | v | 111
2 | A | v | 222
3 | B | x | 333
4 | C | y | 444
5 | C | z | 444
Wenn man jetzt ein GROUP BY feld1 macht und dabei ein * im SELECT hat, wird trotzdem nach allen Feldern Gruppiert. Ergo wird COUNT() immer 1 ausagebn, da die id und das feld3 immer unterschiedlich ist.
Interessiert uns nur das feld1, dann kann man das simple machen, fast so wie crack gezeigt hat. Einfach den * entfernen
Das folgende Query gibt nix aus, da die Kombnation A/z 2 mal vorkommt.
SQL:
SELECT
feld1
FROM
my_table
WHERE
feld1 = 'A'
AND feld2 = 'v'
GROUP BY
feld1
HAVING
COUNT(*) = 1;
Wird der Filter hingegen auf C/y gesetzt, dann wird auch 'C' ausgegeben, da diese Kombination nur einmal vorkommt.
Will man nun aber alle Felder von der Tabelle haben, dann kann man sie zurückverknüpfen
SQL:
SELECT
my_data.*
FROM
my_table AS my_data
INNER JOIN (
SELECT
feld1
FROM
my_table
WHERE
feld1 = 'A'
AND feld2 = 'v'
GROUP BY
feld1
HAVING
COUNT(*) = 1
) AS filter
ON my_data.feld1 = filter.feld1
AND my_data.fedl2 = filter.feld2;
Wobei es auch hier besser wäre, den * durch eine Felderliste zu ersetzen.
Wenn du das ganze noch lesbar im PHP habe willst, dann empfehle ich die folgenden 2 Punkte
a) den SQL-Teil in PHP formatieren:
Heredoc-Syntax
b) Die
Complex (Curly) Syntax anwenden um die Strings zusammenzusetzen. Das reduziert das Chaos mit öffnenden und schliessenden Anführungszeichen und den Verbindungs-Punkten
PHP:
$feld1 = 'C';
$feld2 = 'y';
$sql = <<<SQL
SELECT
my_data.*
FROM
my_table AS my_data
INNER JOIN (
SELECT
feld1
FROM
my_table
WHERE
feld1 = '{$feld1}'
AND feld2 = '$feld2'
GROUP BY
feld1
HAVING
COUNT(*) = 1
) AS filter
ON my_data.feld1 = filter.feld1
AND my_data.fedl2 = filter.feld2;
SQL;
$result = mysql_query($sql);