Hi.
Ich brüchte mal einen Gedankenanstoß, wie ich vernünftig an die Geschichte rangehe.
Folgendes Problem: es gibt u.a. eine Tabelle "members_daten", die sämtliche relevanten Informationen der einzelnen User enthält (Haarfarbe, Größe, Adresse usw.). Jetzt wird eine Suche nach unterschiedlichen Kriterien gewünscht. Sprich: wer hat z.B. dunkjle Haar, ist weiblich und kommt aus dem PLZ Gebiet 1xxx. Bisher auch noch kein Problem. Jetzt soll aber nicht nur die User sortiert angezeigt werden, bei denen alles stimmt, sondern auch die, wo z.B. nur 2 von 3 Kriterien stimmen usw.!
Hat jemand eine Idee, wie ich das elegant lösen kann? Ich brauch nur einen Gedankenanstoß!
Wolf29
Ankündigung
Einklappen
Keine Ankündigung bisher.
Tabellenabfrage, Kriterien koppeln
Einklappen
Neue Werbung 2019
Einklappen
X
-
Tabellenabfrage, Kriterien koppeln
Stichworte: -
-
Ein Gast antworteteSo noch eine andere Idee. Geht allerdings nur wegen einem bösen SQL-Foul.
Code:SELECT m.*, ( SELECT COUNT(*) FROM members_daten m1 WHERE m1.haarfarbe = 2 AND m1.id = m.id) + ( SELECT COUNT(*) FROM members_daten m2 WHERE m2.geschlecht = 2 AND m2.id = m.id) + ( SELECT COUNT(*) FROM members_daten m3 WHERE m3.plz BETWEEN 65000 AND 65500 AND m3.id = m.id) AS q1 FROM members_daten m HAVING q1 >= 2 ORDER BY q1 DESC; +----+--------+-----------+-------+------------+------+ | id | name | haarfarbe | plz | geschlecht | q1 | +----+--------+-----------+-------+------------+------+ | 2 | Name-2 | 2 | 66000 | 2 | 2 | | 4 | Name-4 | 2 | 65000 | 1 | 2 | +----+--------+-----------+-------+------------+------+ 2 rows in set (0.00 sec) mysql>
Thomas
-
Ich bin nicht sicher, ob das vielleicht mit Variablen ginge (wenn, dann vermutlich aber nur via HAVING).
Ist .. WHEN feld = 1 THEN x .. nicht ebenfalls ein schönes boolsches Prädikat?
Einen Kommentar schreiben:
-
Ein Gast antworteteZitat von nikosch Beitrag anzeigenJa. Und IF ist deutlich prägnanter, wenn es um eine boolsche Bedingungs geht. SO what?
Ist .. WHEN feld = 1 THEN x .. nicht ebenfalls ein schönes boolsches Prädikat?
Zitat von nikosch Beitrag anzeigenNaja, die ist ja recht naheliegend. Und ORDER ist natürlich möglich:
Code:... ORDER BY CASE WHEN haarfarbe = 2 THEN 1 ELSE 0 END + CASE WHEN plz BETWEEN 65000 AND 65500 THEN 1 ELSE 0 END + CASE WHEN geschlecht = 2 THEN 1 ELSE 0 END DESC
Grüße
Thomas
Einen Kommentar schreiben:
-
CASE ist zudem deutlich flexibler als IF, wenn es mal mehrere Kriterien in einem CASE - Block gibt.
Für die Abfrage ist mir noch eine dritte Variante eingefallen.
PHP-Code:SELECT * FROM members_daten
WHERE CASE
WHEN haarfarbe = 2 THEN 1
ELSE 0
END +
CASE
WHEN plz BETWEEN 65000 AND 65500 THEN 1
ELSE 0
END +
CASE
WHEN geschlecht = 2 THEN 1
ELSE 0
END >= 2
ORDER BY CASE
WHEN haarfarbe = 2 THEN 1
ELSE 0
END +
CASE
WHEN plz BETWEEN 65000 AND 65500 THEN 1
ELSE 0
END +
CASE
WHEN geschlecht = 2 THEN 1
ELSE 0
END DESC
Einen Kommentar schreiben:
-
Ein Gast antworteteZitat von nikosch Beitrag anzeigenEcht? Der Standard kennt nur CASE, kein IF?
CASE ist zudem deutlich flexibler als IF, wenn es mal mehrere Kriterien in einem CASE - Block gibt.
Für die Abfrage ist mir noch eine dritte Variante eingefallen. Nicht ganz optimal, da so kein ORDER BY möglich ist.
Code:mysql> SELECT * FROM members_daten -> WHERE CASE -> WHEN haarfarbe = 2 THEN 1 -> ELSE 0 -> END + -> CASE -> WHEN plz BETWEEN 65000 AND 65500 THEN 1 -> ELSE 0 -> END + -> CASE -> WHEN geschlecht = 2 THEN 1 -> ELSE 0 -> END >= 2 ; +----+--------+-----------+-------+------------+ | id | name | haarfarbe | plz | geschlecht | +----+--------+-----------+-------+------------+ | 2 | Name-2 | 2 | 66000 | 2 | | 4 | Name-4 | 2 | 65000 | 1 | +----+--------+-----------+-------+------------+ 2 rows in set (0.02 sec) mysql>
Thomas
Einen Kommentar schreiben:
-
Ein Gast antworteteAls komplettes Beispiel könnte es so aussehen:
Code:CREATE TABLE members_daten ( id INT NOT NULL, name VARCHAR(50) NOT NULL, haarfarbe INT, plz INT, geschlecht INT, PRIMARY KEY (id) ); INSERT INTO members_daten VALUES ( 1, 'Name-1', 1, 65000, 1 ), ( 2, 'Name-2', 2, 66000, 2 ), ( 3, 'Name-3', 1, NULL, NULL ), ( 4, 'Name-4', 2, 65000, 1 ); -- 1. Lösung ähnlich der von @nikosch plus zusätzlich der Abfrage nach der Trefferquote >= 2 SELECT treffer.* FROM (SELECT * , (IF (haarfarbe = 2, 1, 0) + IF (plz BETWEEN 65000 AND 65500, 1, 0) + IF (geschlecht = 2, 1, 0) ) AS trefferquote FROM members_daten ) treffer WHERE treffer.trefferquote >= 2 ORDER BY treffer.trefferquote DESC; +----+--------+-----------+-------+------------+--------------+ | id | name | haarfarbe | plz | geschlecht | trefferquote | +----+--------+-----------+-------+------------+--------------+ | 2 | Name-2 | 2 | 66000 | 2 | 2 | | 4 | Name-4 | 2 | 65000 | 1 | 2 | +----+--------+-----------+-------+------------+--------------+ 2 rows in set (0.00 sec) mysql> -- 2. Lösung ähnlich der von @nikosch plus zusätzlich der Abfrage nach der Trefferquote >= 2, das Ganze aber gemäß SQL-Standard SELECT treffer.* FROM (SELECT * , CASE WHEN haarfarbe = 2 THEN 1 ELSE 0 END + CASE WHEN plz BETWEEN 65000 AND 65500 THEN 1 ELSE 0 END + CASE WHEN geschlecht = 2 THEN 1 ELSE 0 END AS trefferquote FROM members_daten ) treffer WHERE treffer.trefferquote >= 2 ORDER BY treffer.trefferquote DESC; +----+--------+-----------+-------+------------+--------------+ | id | name | haarfarbe | plz | geschlecht | trefferquote | +----+--------+-----------+-------+------------+--------------+ | 4 | Name-4 | 2 | 65000 | 1 | 2 | | 2 | Name-2 | 2 | 66000 | 2 | 2 | +----+--------+-----------+-------+------------+--------------+ 2 rows in set (0.00 sec) mysql>
Thomas
Einen Kommentar schreiben:
-
Zukünftig bitte unter Datenbanken posten.
[MOD: verschoben]
Einen Kommentar schreiben:
-
wo z.B. nur 2 von 3 Kriterien stimmen usw.!
Naja egal. Ich danke dir auch für diesen Hinweis *gg*.
Solche Sachen kann man immer mal gebrauchen
cu
Grüße
Einen Kommentar schreiben:
-
Naja, WHERE/HAVING schränkt eben die Auswahl ein und ORDER BY gibt die Sortierung an. Was genau gewünscht ist, ist problemabhängig.
Einen Kommentar schreiben:
-
Zitat von nikosch Beitrag anzeigenCode:ORDER BY IF(haarfarbe = 'blond' , 1 , 0) + IF(alter > 35 , 1 , 0) + IF(plz LIKE '234%' , 1 , 0) DESC
Wäre es aber nicht einfacher dann einfach die ganzen zusammenzuaddiern und dann mit eine HAVING / WHERE - Abfrage zu schauen ob `anzahl` > 3 ist z.B. ?
Danke
cu
Grüße
Einen Kommentar schreiben:
Einen Kommentar schreiben: