MySql PHP Auswahl der Anzahl der verschiedenen Werte aus kommagetrennten Daten (Tags)

8

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?

    
Norman 06.10.2014, 11:32
quelle

5 Antworten

13

Lösung

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%

Siehe sqlfiddle

Erklärung

Szenario

  1. Wir verketten alle Tags mithilfe eines Kommas, um nur eine Liste von Tags anstelle von einem pro Zeile zu erstellen
  2. Wir zählen, wie viele Tags wir in unserer Liste haben
  3. Wir finden, wie wir einen Wert in dieser Liste erhalten können
  4. Wir finden, wie wir alle Werte als einzelne Zeilen erhalten können
  5. Wir zählen Tags nach ihrem Wert gruppiert

Kontext

Lass uns dein Schema erstellen:

%Vor%

Verkette alle Listen von Tags

Wir arbeiten mit allen Tags in einer einzigen Zeile, also verwenden wir GROUP_CONCAT , um den Job zu erledigen:

%Vor%

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

Zählt alle Tags

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.

%Vor%

Rückkehr:

%Vor%

Erhalte das N-te Tag in der Tag-Liste

Wir verwenden die Funktion SUBSTRING_INDEX , um

zu erhalten %Vor%

Mit dieser Logik verwenden wir:

, um das 3. Tag in unserer Liste zu erhalten %Vor%

Rückkehr:

%Vor%

Alle Werte als separate Zeilen abrufen

Meine Idee ist ein wenig schwierig:

  1. Ich weiß, dass wir Zeilen erstellen können, indem wir Tabellen
  2. verbinden
  3. Ich muss das N-te Tag in der Liste mit der obigen Anfrage erhalten

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:

%Vor%

Rückgabe:

%Vor%

Anzahl der Stichprobenereignisse

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 Tiemblo 13.11.2014, 19:27
quelle
5

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):

%Vor%

Siehe SQLFiddle zu Demonstrationszwecken.

    
Paul 13.11.2014 20:12
quelle
2

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%     
Gordon Linoff 06.10.2014 11:35
quelle
1

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;

    
anupam.singhal 17.11.2014 22:57
quelle
0

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:

Ссылка

    
user2019783 14.11.2014 00:44
quelle

Tags und Links