MySQL: Einen Alias innerhalb einer WHERE-Klausel verwenden

Wenn du anfängst, mit SQL zu arbeiten, wirst du schnell merken, dass man mit SQL sehr viel machen kann. Man kann bspw. zwei Spalten kombinieren und als einzelne ausgeben. Das ist sehr nützlich, wenn man bspw. einen Vor- und Nachnamen zusammenfassen möchte. Der Nachteil ist, dass man innerhalb einer WHERE-Klausel nicht einen Alias filtern kann, zumindest nicht so einfach.

Alias definieren

Zuerst fangen wir damit an, dass wir unseren Alias definieren. Wir wollen in unserem Fall den Vor- und Nachnamen zusammenfassen und ein Leerzeichen dazwischen setzen. Dies geht folgendermaßen:

SELECT *, concat(first_name, ' ', last_name) AS full_name FROM users;Code-Sprache: PHP (php)

Wie du siehst, verwenden wir CONCAT, um unsere Spalten zusammenzufassen. Falls das bei dir nicht direkt funktioniert, kannst du auch folgendes ausprobieren: 

SELECT *, concat(concat(first_name, ' '), last_name) AS full_name FROM users;Code-Sprache: PHP (php)

Das kann passieren, wenn deine Datenbank nur zwei Werte für CONCAT unterstützt. Wenn wir jetzt bspw. innerhalb full_name filtern wollen, würden wir das in der Regel so machen:

SELECT *, concat(first_name, ' ', last_name) AS full_name FROM users WHERE full_name LIKE '%kevin%';Code-Sprache: PHP (php)

Du wirst jetzt eine Fehlermeldung erhalten, da full_name nicht gefunden wurde. Das liegt daran, dass SQL das Filtern von Aliase nicht ermöglicht. Du kannst aber trotzdem mit einem Alias arbeiten, wenn du zwei Query miteinander verbindest. Das könnte dann so aussehen:

SELECT *, (concat(first_name, ' ', last_name) AS full_name FROM users) AS irgendwas WHERE full_name LIKE '%kevin%';Code-Sprache: PHP (php)

Volltextsuche

Jetzt haben wir im Grunde zwei Query in einem und der Zugriff auf den Alias innerhalb einer WHERE-Klausel funktioniert wie gewollt. Eine Alternative ist die Volltextsuche, die gleich mehrere Spalten zusammenfassen kann. Dafür musst du allerdings die ganzen Spalten, die du durchsuchen möchtest, erst als FULLTEXT definieren. Das geht in unserem Beispiel folgendermaßen:

CREATE FULLTEXT INDEX full_name ON users(first_name, last_name);

Haben wir unseren Index festgelegt, suchen wir mittels MATCH nach unseren Inhalten. Dies hatte ich bereits geschrieben, hier aber noch einmal:

SELECT * FROM users WHERE MATCH (first_name, last_name) AGAINST ('kevin' IN BOOLEAN MODE);Code-Sprache: JavaScript (javascript)

Wann immer du die Möglichkeit hast, eine Volltextsuche zu erstellen, solltest du das machen. Die Volltextsuche ist immer schneller, als LIKE-Klauseln.