2016-12-22 2 views
1

Ich habe 2 Tabellen in mysql, tbl_post & tbl_comment,Crosstab Abfrage in MySQL mit phpMyAdmin

Ich benötige eine Kreuztabellenabfrage, basierend auf tbl_post.post_id, sollte das Ergebnis sein wie

all elments of tbl_post + count of records form tbl_comment, where 
tbl_post.post_id == tbl_comment.post_id 

z.B. Ergebnis sollte wie sein ::

post_id,title,content,tags,status,create_time,update_time,author_id,likes + count from tbl_comment 

Bitte sehen Sie das Bild.

Ich bin neu auf SQL nur akademische Kenntnisse und konnte es nicht herausfinden. Jede Hilfe wird geschätzt.

enter image description here

Antwort

2

Ich denke, man muss nur tbl_post zu einer Unterabfrage kommen, die die Anzahl der Kommentare für jeden Post zählt.

SELECT t1.*, 
     COALESCE(t2.post_count, 0) AS post_count 
FROM tbl_post t1 
LEFT JOIN 
(
    SELECT post_id, COUNT(*) AS post_count 
    FROM tbl_comment 
    GROUP BY post_id 
) t2 
    ON t1.post_id = t2.post_id 

Wenn Sie eine Ansicht mit der obigen Abfrage erstellen möchten, müssen Sie ein wenig kreativ werden. Der folgende Versuch wird fehlschlagen, da die obige Abfrage eine Unterabfrage in sich hat:

CREATE VIEW PostCountView AS 
SELECT t1.*, 
     COALESCE(t2.post_count, 0) AS post_count 
FROM tbl_post t1 
... 

Stattdessen Sie eine Ansicht für die Unterabfrage erstellen, und dann, dass für die Hauptabfrage in einer zweiten Ansicht verwenden:

CREATE VIEW PostCountView AS 
SELECT post_id, COUNT(*) AS post_count 
FROM tbl_comment 
GROUP BY post_id 

CREATE VIEW PostCountMainView AS 
SELECT t1.*, 
     COALESCE(t2.post_count, 0) AS post_count 
FROM tbl_post t1 
LEFT JOIN PostCountView t2 
    ON t1.post_id = t2.post_id 
+0

Es funktioniert dank, können Sie mir bitte sagen, wie Sie diese Abfrage als Ansicht speichern. – raju

+0

PhpMyadmin geben Fehler # 1349 - Views SELECT enthält eine Unterabfrage in der FROM-Klausel. – raju

+0

@Raju Ich habe meine Antwort aktualisiert. Eine Lösung besteht darin, zwei Ansichten zu verwenden, eine für die Unterabfrage. –

0
select t1.post_id, 
     t1.title, 
     t1.content, 
     t1.tags, 
     t1.status, 
     t1.create_time, 
     t1.updated_time, 
     t1.author_id, 
     t1.likes, 
     count(t2.post_id) 
from tbl_post t1 
LEFT JOIN tbl_comment t2 
    on t1.post_id = t2.post_id 
group by t1.post_id; 
+0

ARBEITEN Das funktioniert. Danke – raju

+0

Diese Abfrage hat ein ernstes Problem, nämlich, dass es nicht aggregierte Spalten auswählt, während 'GROUP BY' nur auf der' post_id' verwendet wird. Diese Abfrage würde nicht einmal bei einigen Versionen von MySQL oder wirklich jeder anderen Datenbank ausgeführt werden. –