Zwei SQL Statements zusammenführen

Tommy57

Erfahrenes Mitglied
Hallo,

ich habe zwei Tabellen, wo jeweils einmal Vornamen und einmal Nachnamen nach Häufigkeit sortiert drin stehen. Diese Tabelle dient nur für die Autocomplete-Funktion eines Suchfelds.

Aktuell verwende ich zwei Statements und etwas PHP. Ich suche EINE SQL-Abfrage, die mir das ganze PHP ersparen soll. Wichtig dabei ist, dass der zweite Teil des Statements 10 Nachnamen rausholt, ohne doppelte Einträge, quasi where nachname != vorname. Als Resulat sollten dann 20 Zeilen rauskommen, wo die ersten 10 Vornamen und die zweiten 10 Nachnamen sind.

Hätte da jemand eine Idee? Meine finde ich nicht so gut.

Code:
SELECT nachname as name FROM suchtabelle_nachnamen WHERE nachname LIKE '%Man%' LIMIT 10;

SELECT vorname as name FROM suchtabelle_vornamen WHERE vorname LIKE '%Man%' LIMIT 15;

...
...

$i = 0;
foreach ($vornamen as $value) $result[$i++] = $value;
foreach ($nachnamen as $value) {
    if (!in_array($value, $result)) $result[$i++] = $value;
    if ($i > 20) break;
}

Gruß
 
müsste so eigendlich funktionieren (untested)
SQL:
SELECT distinct name FROM (
SELECT nachname as name FROM suchtabelle_nachnamen WHERE nachname LIKE '%Man%' LIMIT 10;
UNION
SELECT vorname as name FROM suchtabelle_vornamen WHERE vorname LIKE '%Man%' LIMIT 15;
) x 
LIMIT 10
 
Super, das klappt fast!

Also jetzt habe ich das Problem, dass er mir die Sortierung kaputt macht und wenn ich die IDs mit auslese (je niedriger die ID, umso häufiger ist der Name vertreten) und das danach sortiere, habe ich doppelte Einträge wieder drin.

Wie kann ich das denn jetzt sortieren und doppelte Einträge rausschmeißen?

Gruß

Code:
SELECT DISTINCT(name), type, id FROM
(SELECT nachname AS name, 1 as type, id FROM suchtabelle_nachnamen WHERE lower(nachname) LIKE '%man%' LIMIT 10) x
UNION
(SELECT vorname AS name, 2 as type, id FROM suchtabelle_vornamen WHERE lower(vorname) LIKE '%man%' LIMIT 20)
ORDER BY type ASC, id ASC
LIMIT 20
 
Da du nun den type und die ID mit selectest in den inneren selects, kannst du UNION ALL verwenden, anstatt union.

Das distinct löscht nur doppelte einträge die komplett identisch sind (und zwar alle spalten, klammern haben an der stelle keinen effekt), hast du also die id und den type dabei, funktioniert distinct nicht und muss durch group by ersetzt werden.

so sollte es gehen:

SQL:
SELECT name, min(type), min(id) FROM (
SELECT nachname AS name, 1 as type, id FROM suchtabelle_nachnamen WHERE lower(nachname) LIKE '%man%' LIMIT 10
UNION ALL
SELECT vorname AS name, 2 as type, id FROM suchtabelle_vornamen WHERE lower(vorname) LIKE '%man%' LIMIT 20) x
GROUP BY name
ORDER BY min(type) ASC, min(id) ASC
LIMIT 20
 

Neue Beiträge

Zurück