MySQL: @var oder .... in einem Select

k3nguruh

Erfahrenes Mitglied
Hallo,

das ist nur ein kurzer Auszug aus einer Abfrage.
Ich möchte gerne Wissen, welche Abfrage die Richtige / Bessere ist. Jedendalls liefern beide das, was auch gewünscht ist.
PHP:
$_POST['sign'] = 'a'
SQL:
SELECT
    a.id,
    a.code,
    'a' AS sign
FROM
    admin AS a
HAVING
    sign = $_POST['sign']
SQL:
SELECT
    a.id,
    a.code,
    @sign := 'a' AS sign
FROM
    admin AS a
HAVING
    sign = $_POST['sign']

Vll zum besseren Verständnis
PHP:
$_POST['sign'] = 'a'
SQL:
SELECT
    a.id,
    a.code,
    'a' AS sign
FROM
    admin AS a
HAVING
    sign = $_POST['sign']
UNION
SELECT
    k.id,
    k.code,
    'k' AS sign
FROM
    kunden AS k
HAVING
    sign = $_POST['sign']
UNION
SELECT
    m.id,
    m.code,
    'm' AS sign
FROM
    mitglieder AS m
HAVING
    sign = $_POST['sign']
 
Ich finde die Verwendung von HAVING seltsam, da HAVING bekanntlich benutzt wird um einen Filter auf aggregierte Felder zu setzen, was bekanntlich in einem WHERE-Abschnitt nicht geht.

Hätte eher sowas gemacht:
SQL:
SELECT * FROM
       (SELECT a.id, a.code, 'a' As sign FROM admin As a
        UNION
        SELECT k.id, k.code, 'k' As sign FROM kunden as k
        UNION
        SELECT m.id, m.code, 'm' As sign FROM mitglieder As m)
WHERE sign='m' //bzw. dein $_POST['sign']

EDIT: Würde mal alle Varianten in MySQL Workbench durch den Query Analyzer laufen lassen.
 
Zuletzt bearbeitet:
Wie Zvoni schreibt, WHERE..

Zur Variable. Ja, de setzt @Sign, wertest es aber nirgens aus. Also kannst du das auch sein lassen.
 
Hallo,

erstmal Danke für die Antwort. Leider bringt mir phpMyAdmin einen Fehler.

Code:
SELECT * FROM
       (SELECT a.id, a.code, 'a' As sign FROM admin As a
        UNION
        SELECT k.id, k.code, 'k' As sign FROM kunden as k
        UNION
        SELECT m.id, m.code, 'm' As sign FROM mitglieder As m)
WHERE sign='m' LIMIT 0, 25

#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'WHERE sign='m' LIMIT 0, 25' in Zeile 7
 
Huh?
funktionerts ohne LIMIT? Oder nur mit LIMIT 25 (offset 0 ist ja unfug)

EDIT: ich habs in SQLite getestet, aber ich seh nix spezifisches in meinem Query
 
Hallo,

sorry, hatte hier nen Komplettausfall.

Also das Limit setzt phpMyAdmin automatisch an die Anfrage mit ran, ausser man gibt es selber an. Ich habe die Abfrage im Script gemacht, mit dem gleichen negativen Ergebnis.
Bis jetzt werde ich wohl bei meiner Lösung bleiben, wenn nichts gravierendes dagegen spricht.
 
Habs auf sqlfiddle getestet:
Anscheinend muss man einen Alias für die Klammer vergeben
SQL:
SELECT test.* FROM
       (SELECT a.id, a.code, 'a' As sign FROM admin As a
        UNION
        SELECT k.id, k.code, 'k' As sign FROM kunden as k
        UNION
        SELECT m.id, m.code, 'm' As sign FROM mitglieder As m) As test
WHERE test.sign='m'
 
Zurück