2016-08-09 21 views
0

Tabelle Kategorien:PHP ausgewählten Kategorien und Zählnummer

id, name,  
------------- 
1 category1 
2 category2 
3 category3 
4 category4 

Tabelle Beiträge:

id, category, title 
-------------------- 
1 1, 3  title1 
2 4, 2  title2 
3 1, 4  title3 

Ich möchte eine Show Kategorien und Gegen Beiträge in dieser Kategorie haben. In der Kategoriespalte in der Tabelle werden I IDs der Kategorien veröffentlicht, die durch ',' getrennt sind. Wie das geht, wird gesucht, wenn Kategorie = Kategorie-ID und Zähler mit einem Minimum an SQL-Abfragen angezeigt wird.

+5

Korrigieren Sie Ihre Datenstruktur, um eine ordnungsgemäße Junction-Tabelle mit einer Zeile pro Beitrag und Kategorie zu haben. –

+2

Verwenden Sie nicht CSV, vor allem, wenn Sie suchen möchten. Wenn Sie mehrere Werte für eine Zeile benötigen, erstellen Sie eine neue Tabelle mit Zeilen für die ID und jede Kategorie. – Sean

Antwort

4

Sie sollten Ihre Datenstruktur reparieren, um eine Zeile pro Beitrag und Kategorie zu haben. Eine durch Kommas getrennte Liste ist nicht eine SQLish-Methode zum Speichern von Daten aus vielen Gründen. Sie sollten dies in eine Junction-Tabelle ändern.

Hier sind einige Gründe, warum:

  • Zahlen als Zahlen gespeichert werden sollen und keine Strings.
  • Fremdschlüsselbeziehungen sollten ordnungsgemäß definiert werden, und Sie können das nicht mit einer Zeichenfolge zu einer Zahl tun.
  • Ein Attribut sollte einen Wert enthalten.
  • MySQL hat keine sehr gute Unterstützung für String-Verarbeitungsfunktionen.
  • Abfragen, die die Spalte verwenden, können nicht mithilfe von Indizes optimiert werden.

Sie sollten eine Tabelle mit der Bezeichnung PostCategories für diese Information haben.

Manchmal sind wir mit anderen Menschen schlechte Design-Entscheidungen fest. Wenn dies der Fall ist, können Sie eine Abfrage wie die folgende verwenden:

select c.id, count(*) 
from posts p join 
    categories c 
    on find_in_set(c.id, replace(p.category)) > 0 
group by c.id; 
+1

Eine Menge Leute sind überraschend ignorant über die [Null, eine oder Unendlichkeitsregel] (http://en.wikipedia.org/wiki/Zero_one_infinity_rule). – tadman

Verwandte Themen