Wie kann ich die Anzahl der verschiedenen Werte aus Daten auswählen, die als kommagetrennte Werte in MySql gespeichert sind? Ich werde PHP verwenden, um die Daten von MySql am Ende auszugeben.
Was drin ist, sind Tags für jeden Beitrag. Also versuche ich am Ende, Daten so auszugeben, wie es stackoverflow mit seinen Tags macht:
%Vor%So sehen die Daten in der Tabelle aus (Entschuldigung für den Inhalt, aber es ist eine Seite für Rezepte).
%Vor%Ausgabe
%Vor% Ich versuche select count of all distinct values in there
, aber da es sich um durch Komma getrennte Daten handelt, scheint es keine Möglichkeit zu geben, dies zu tun. select distinct
funktioniert nicht.
Kannst du dir einen guten Weg in mysql vorstellen oder php verwenden, um die Ausgabe zu erhalten, so wie ich es gemacht habe?
Ich weiß nicht wirklich, wie man eine horizontale Liste kommagetrennter Werte in eine Liste von Zeilen umwandelt, ohne eine Tabelle mit Zahlen zu erstellen, so viele Zahlen wie Komma-getrennte Werte. Wenn Sie diese Tabelle erstellen können, hier ist meine Antwort:
%Vor%Rückkehr:
%Vor%Lass uns dein Schema erstellen:
%Vor% Wir arbeiten mit allen Tags in einer einzigen Zeile, also verwenden wir GROUP_CONCAT
, um den Job zu erledigen:
Gibt alle durch ein Komma getrennten Tags zurück:
pho, Schweinefleisch, gebratener Reis, Huhn, gebratener Reis, Schweinefleisch, Huhn-Calzone, Huhn, Fettuccine, Huhn, Spaghetti, Huhn, Spaghetti, Chorizo, Spaghetti, Fleischbällchen, Misosuppe, Chanko-Nabe , Huhn-Manchurian, Huhn, Manchurain, Schweinefleisch-Manchurian, Schweinefleisch, Manchurain, süß-saures Schweinefleisch, Schweinefleisch, Pekingente, Ente
Um alle Tags zu zählen, erhalten wir die Länge der vollständigen Liste der Tags, und wir entfernen die Länge der vollständigen Liste der Tags nach dem Ersetzen der ,
durch nichts. Wir fügen 1 hinzu, da das Trennzeichen zwischen zwei Werten liegt.
Rückkehr:
%Vor% Wir verwenden die Funktion SUBSTRING_INDEX
, um
Mit dieser Logik verwenden wir:
, um das 3. Tag in unserer Liste zu erhalten %Vor%Rückkehr:
%Vor%Meine Idee ist ein wenig schwierig:
Wir werden also eine Tabelle erstellen, die alle Zahlen von 1 bis zur maximalen Anzahl von Tags enthält, die Sie in Ihrer Liste haben können. Wenn Sie 1M-Werte haben können, erstellen Sie 1M-Einträge von 1 bis 1.000.000. Für 100 Tags ist dies:
%Vor% Nun erhalten wir die num
th (Anzahl ist eine Zeile in number
) mit der folgenden Abfrage:
Rückgabe:
%Vor%Sobald wir jetzt classic Zeilen haben, können wir die Vorkommen der einzelnen Tags einfach zählen.
Siehe oben auf dieser Antwort , um die Anfrage zu sehen.
Alain Tiembo hat eine nette Antwort, die viele der darunter liegenden Mechaniken erklärt. Seine Lösung benötigt jedoch eine temporäre Tabelle (Nummern), um das Problem zu lösen. Als Follow-up-Antwort kombiniere ich alle seine Schritte in einer einzigen Abfrage (mit tablename
für Ihre ursprüngliche Tabelle):
Siehe SQLFiddle zu Demonstrationszwecken.
Zuerst sollten Sie dies mithilfe einer Junction-Tabelle mit einer Zeile pro Post und Tag speichern. Manchmal können wir jedoch die Struktur der Daten, mit denen wir arbeiten, nicht kontrollieren.
Sie können tun, was Sie wollen, vorausgesetzt Sie haben eine Liste gültiger Tags:
%Vor%Dies wird empfohlen, indem Sie nicht mehrere Werte in einer einzelnen Spalte speichern, sondern eine Schnittmenge erstellen.
Also würden Ihre Tabellen diese Spalten haben:
1. Tags: tag_id, Name
2. posts: post_id, category_code
3. int_tags_to_posts: post_id, tag_id
Um die Anzahl zu erhalten:
select t.name, count(*) from tags t, posts p, int_tags_to_posts i where i.post_id = p.post_id and i.tag_id = t.tag_id group by i.tag_id order by count(*) desc;
Das sollte funktionieren:
%Vor%Ersetzen Sie "Tabellenname" durch den Namen Ihrer Tabelle.
Diese Antwort wurde von einer Lösung von Jesse Perring auf dieser Seite abgeleitet: