2016-05-22 8 views
-1

Ich muss eine SQL-Abfrage mit PDO machen, um mit einem linken Join und einer Zählung von total zu zählen.SQL + LINKE VERBINDUNG + LIKE + COUNT

hier meine DB

TABLE CONTENT

ID | TYPE  | ACTION       | 
1 | picture  | ['1324234324', '4545647777']  | 
1 | picture  | ['4545647777', '7888945555']  | 
1 | video  | ['1324234324']     | 

Tabelle Seite

ID | PAGEID           | 
1 | 1324234324          | 
1 | 4545647777          | 
1 | 7888945555          | 

Und hier meine Frage! Ich möchte COUNT() für jede Art von pageid erhalten

ex: (das ist, was ich für das Ergebnis benötigen)

  • Seite 1324234324 haben 1 Bild und 1 Video
  • Seite 4545647777 2 Bild haben und 0 Video
  • Seite 7888945555 haben 1 Bild und 0 Video

Jetzt meine Frage ist:

SELECT 
    A.page_name AS page_name, 
    IFNULL(B.countId, 0) AS total_picture, 
    IFNULL(C.countId, 0) AS total_video 
FROM page A 
LEFT JOIN (SELECT action, COUNT(id) as countId FROM content WHERE type = 'picture') B ON (B.action LIKE CONCAT('%', A.page_id, '%')) 
LEFT JOIN (SELECT action, COUNT(id) as countId FROM content WHERE type = 'video') C ON (C.action LIKE CONCAT('%', A.page_id, '%')); 

Aber das Ergebnis ist wirklich nicht das, was ich erwarte: -/

Kann mir bitte jemand damit helfen? Seine seit 10 Stunden und ich habe keine Ahnung :-(

+0

Wofür ist die ID-Spalte? Warum sind sie alle 1? – Terminus

+1

Auch diese ganze Sache wäre wahrscheinlich einfacher, wenn Sie die 'content' Tabelle normalisieren – Terminus

+2

Sie haben' A.page_id' aber es gibt keine Spalte mit diesem Namen, Sie haben 'PAGEID' und' A.page_name' sollten Sie nicht 'A.page' und' B.countId' als 'B.ID'? * "Aber das Ergebnis ist wirklich nicht das, was ich erwarte" * - Was sind "Ergebnisse", die du gerade bekommst? Gibt es Fehler oder suchen Sie nicht nach ihnen? Funktioniert die Abfrage in Ihrer Konsole, nur nicht in PDO oder haben Sie noch kein PDO dafür geschrieben? Ihre Frage ist unklar, wie Ihre Anfrage ist. –

Antwort

1

die Sie interessieren.

select 
page_name 
, (select COUNT(*) from content where type = 'picture' and CONTAINS(action, page.page_id)) as total_picture 
, (select COUNT(*) from content where type = 'video' and CONTAINS(action, page.page_id)) as total_video 
from page 

(oder verwenden Sie „wie“ anstelle des ENTHÄLT)

+0

(SELECT COUNT (*) FROM Inhalt WHERE type = 'Bild' UND Aktion LIKE CONCAT ('%', A.pageid, '%')) AS total_picture –

1

Pause nach unten, was Sie in Teile benötigen schreiben eine Abfrage für das. es zusammen Mitglied werden.

Sie müssen jede pageid von page in jeder Reihe in content finden. Sie müssen die Anzahl der Zeilen von content, die eine einzelneenthaltens.

SELECT p.pageid, vid.numVideo, pic.numPicture 
FROM page p 
LEFT JOIN (
    SELECT p.pageid, COUNT(id) AS numVideo 
    FROM page p 
    INNER JOIN content c 
    ON c.content LIKE CONCAT('%', p.pageid, '%') 
    WHERE c.type = 'video' 
    GROUP BY p.pageid 
) vid ON vid.pageid = p.pageid 
LEFT JOIN (
    SELECT p.pageid, COUNT(id) AS numPicture 
    FROM page p 
    INNER JOIN content c 
    ON c.content LIKE CONCAT('%', p.pageid, '%') 
    WHERE c.type = 'picture' 
    GROUP BY p.pageid 
) pic ON pic.pageid = p.pageid 

Ändern Sie zum Verbessern der Leistung, wie Sie die Daten speichern. Verwenden Sie eine 3. Tabelle, um die Beziehung zwischen Inhalt und Seite zu speichern. Dies würde der neuen Abfrage ermöglichen, Indizes zu nutzen.

0

So:

SELECT p.pageid, type, count(*) cnt FROM `PAGE` p 
LEFT JOIN `CONTENT` c ON c.action like concat('%', p.pageid, '%') 
Group By PAGEID, `type` 

Hinweis:

  1. PAGEID ist archer Spalte, ACTION ist archer.
  2. PAGEID und CONTENT.id sind id eindeutige Zahlen nicht wie Sie alle 1.