SQL + LEFT JOIN + LIKE + COUNT

时间:2016-05-22 03:18:30

标签: php mysql count left-join

我必须使用PDO进行SQL查询,以使用左连接和总计数进行计数。

这是我的数据库

表格内容

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

表格页面

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

这是我的问题!我想通过pageid获取每种类型的COUNT()

ex :(这是我需要的结果)

  • Page 1324234324有1张图片和1个视频
  • Page 4545647777有2张图片和0个视频
  • Page 7888945555有1张图片和0个视频

现在我的查询是:

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, '%'));

但结果真的不是我所期望的: - /

有人可以帮帮我吗?已经10个小时,我不知道: - (

3 个答案:

答案 0 :(得分:1)

试试这个:

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

(或使用"喜欢"而不是CONTAINS)

答案 1 :(得分:1)

将您需要的内容细分为零件。写一个查询。加入吧。

您需要在pageid的每一行中找到page中的每个content。您需要content中包含单个pageid s。

的行数
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

要提高性能,请更改存储数据的方式。使用第3个表来存储内容和页面之间的关系。这将允许新查询利用索引。

答案 2 :(得分:0)

像这样:

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

注意

  1. PAGEIDarcher列,ACTIONarcher
  2. PAGEIDCONTENT.id的{​​{1}}唯一数字与您的所有id不同。