2016-04-30 4 views
0

Eine Abfrage, die alle Beiträge zurückgibt, zusammen mit wie oft es angesehen wurde, und wie viele Likes der Beitrag haben. Problem ist es Duplikate zurück, weil einer anderen beitreten i in Frage habenMysql beitreten distinct

 SELECT count(bv.postId) as views, SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meeh, GROUP_CONCAT(taxonomy_id) as target, GROUP_CONCAT(t.name) as tname, `t`.`type` as `ttype`, `users`.`fullname`, `users`.`picture`, `users`.`role`, `users`.`picture`, `blog`.* FROM `blog` 
INNER JOIN `blog_taxonomy` `bt` ON `bt`.`blog_id` = `blog`.`id` 
INNER JOIN `users` ON `users`.`id` = `blog`.`user_id` 
INNER JOIN `taxonomy` `t` ON `t`.`id` = bt.`taxonomy_id` 
LEFT JOIN `blog_views` `bv` ON `blog`.`id` = `bv`.`postId` 
WHERE MONTH(blog.time_posted) = 4 AND `blog`.`deleted` =0 GROUP BY `blog`.`id` ORDER BY `blog`.`id` DESC 

blog_views Tabelle ist eine einfache Tabelle i zu halten verwenden, um Spur, der sah, was für Post, und wenn er es will oder nicht

Table:blog_views 
postId userId vote[int values, 1 for like, -1 for dislike and 0 default] 

Problem ist Anzahl der Aufrufe immer zurück n * Anzahl der Blog_taxonomie Tabelle! was ich benutze, um Tags auf Post zu steuern.

Table blog_taxonomy: 
taxonomy_id post_id 
1   1 
2   1 
Table Taxonomy 
id name 
    1 art 
    2 music 

dies ist eine viel zu viele Tabelle verwendet, um Beiträge mit Tags zu verknüpfen. lösen das Problem, das es von Abfrage zu entfernen :(aber ich brauche es dort!

i bv.postId in der Gruppe Hinzufügen versucht durch, aber es scheint, überhaupt keine Wirkung zu haben!

in normal, ich kann erhalten Ansichten Daten ich möchte einen Beitrag

select count(bv.postId) as views, SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meet from blog_views where postId = ?{blog.id} 
group by postId 

mit, was ich hier fehle?

bearbeiten

Mit der Unterabfrage wurde das Problem behoben. Warum funktioniert die Unterabfrage-Methode und funktioniert die Verknüpfung nicht?

SELECT bv.views, bv.likes, bv.meeh, GROUP_CONCAT(taxonomy_id) as target, GROUP_CONCAT(t.name) as tname, `t`.`type` as `ttype`, `users`.`fullname`, `users`.`picture`, `users`.`role`, `users`.`picture`, `blog`.* FROM `blog` 
INNER JOIN `blog_taxonomy` `bt` ON `bt`.`blog_id` = `blog`.`id` 
INNER JOIN `users` ON `users`.`id` = `blog`.`user_id` 
INNER JOIN `taxonomy` `t` ON `t`.`id` = bt.`taxonomy_id` 
LEFT JOIN (select count(*) as views,postId,SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meeh from `blog_views` group by postId) `bv` ON `bt`.`blog_id` = `bv`.`postId` 
WHERE MONTH(blog.time_posted) = 4 AND `blog`.`deleted` =0 GROUP BY `blog`.`id` ORDER BY `blog`.`id` DESC 
+0

von welcher Tabelle kommt taxonomy_id? –

+0

@ KP. blog_taxonomie – Zalaboza

+0

Es scheint mir, Sie haben Ihre eigene Frage beantwortet. Wenn Sie immer noch verwirrt sind, feuern Sie dieselben Abfragen ohne die äußeren Aggregatfunktionen und die group by-Klausel. – Strawberry

Antwort

0

Von dem, was ich Ihre JOIN-Bedingung auf Taxonomietabelle verstehen ist nicht richtig JOIN taxonomy t ON t.id = taxonomy_id

  1. Add Alias ​​taxonomy_id dh bt.taxonomy_id wenn diese noch nicht
  2. funktioniert
  3. machen alle verbindet als INNER JOIN
+0

hat nur das :(, zählen noch Rückkehr Anzahl von blog_taxonomy Zeilen – Zalaboza

+0

können Sie Ihre Tabellenstrukturen und Beispieldaten posten? –

+0

nur tat :). zusammen mit einer Lösung, die ich gerade durch Versuch und Irrtum gefunden habe! – Zalaboza