MySQL Datenabfrage nach Priorität

Daaguru

Erfahrenes Mitglied
Hallo zusammen,

ich hoffe ihr könnt mir weiterhelfen.
Aktuell stehe ich vor dem Problem, dass ich in meiner MySQL DB Beiträge durchsuchen möchte die folgende Kriterien erfüllt:

Ich habe fünf Begriffe: Auto, Fahrrad, Handy, Geldbeutel, Schlüssel und möchte die Beiträge herausfiltern die die meisten Übereinstimmungen beinhalten und Absteigend sortiert werden.

Eigentlich ist das Ergebnis eine Art Suchmaschinen Ranking: Meiste Treffer oben, geringste Treffer unten.

Danke und Grüße,
~daa|guru~
 
Du musst mehr über deine Datenstruktur verraten damit wir dir helfen können

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Hi Yaslaw,

die Datenstruktur ist recht einfach: ich habe ein Feld vom Typ Varchar in dem ein Kommaseparierter String (eigentlich stellt jedes Wort ein Tag dar) den ich Anhand von unterschiedlichen Begriffen durchsuchen möchte.

Code:
id   | tags
-----------------------------------------------------------------
1    | auto, boot, schiff, fahrrad
2    | ipad, iphone, ios, smartphone
3    | webdesign, webentwicklung, development
.....

Und die Anzahl meiner Suchbegriffe bewegt sich zwischen 1 und 5.

Danke im Vorraus!
 
Jepp, damit kann man was anfangen

Das Problem ist, du willst eine SET mit einem SET abgleichen. Das geht in MySQL nur über Umwege. Eine normalisierung der Tabelle währe am elegantesten (Auslagernd er Tags in eine tag-Tabelle.

SQL:
SELECT
	my_table.*,
	grp.cnt
FROM
	my_table
	INNER JOIN (
			SELECT
				id,
				COUNT(*) AS cnt
			FROM
				(
					SELECT '{$tags[0]}' AS s_tag
					UNION ALL SELECT '{$tags[1]}'
					UNION ALL SELECT '{$tags[2]}'
					UNION ALL SELECT '{$tags[3]}'
					UNION ALL SELECT '{$tags[4]}'
				) AS vars,
				my_table
			WHERE
				-- für die SQL-Liste darf es keine Leerzeichen nach dem Komma haben. Darum der REPLACE
				FIND_IN_SET(s_tag, REPLACE(tags, ', ', ','))
			GROUP BY
				id
		) AS grp
		ON grp.id = my_tabe_id
ORDER BY
	grp.cnt DESC

Der Aufruf in PHP sieht dann etwa so aus
Ich arbeite dabei mit den 2 folgenden Schreibweisen
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:
// Tags-Array initialisieren. Sicherstellen dass er 5 Einträge hat
$tags = array_fill(0, 5, '');
//TODO: Einträge in $tags mit den Eingaben überschreiben
$sql = <<<SQL
SELECT
	my_table.*,
	grp.cnt
FROM
	my_table
	INNER JOIN (
			SELECT
				id,
				COUNT(*) AS cnt
			FROM
				(
					SELECT '{$tags[0]}' AS s_tag
					UNION ALL SELECT '{$tags[1]}'
					UNION ALL SELECT '{$tags[2]}'
					UNION ALL SELECT '{$tags[3]}'
					UNION ALL SELECT '{$tags[4]}'
				) AS vars,
				my_table
			WHERE
				-- für die SQL-Liste darf es keine Leerzeichen nach dem Komma haben. Darum der REPLACE
				FIND_IN_SET(s_tag, REPLACE(tags, ', ', ','))
			GROUP BY
				id
		) AS grp
		ON grp.id = my_tabe_id
ORDER BY
	grp.cnt DESC
SQL;

$result = mysql_query($sql);
 
Zuletzt bearbeitet von einem Moderator:
Ja, da gebe ich dir recht. Normalisiert ist das nicht!
Leider ist die Tabelle nicht mein Konstrukt und ich muss nun damit arbeiten.

Vielen Dank für deine Lösung!
Hat mit leichter Anpassung wunderbar gepasst!
 
Zurück