SQL + 左连接 + 喜欢 + 计数

SQL + LEFT JOIN + LIKE + COUNT

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

这是我的数据库

TABLE 内容

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

TABLE 页数

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

这是我的问题!我想通过 pageid

为每种类型获取 COUNT()

例如:(这是我需要的结果)

现在我的查询是:

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 个小时了,我不知道:-(

试试这个:

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

(或使用 "like" 而不是 CONTAINS)

把你需要的东西分解成几个部分。为此写一个查询。一起加入吧。

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

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 个 table 来存储内容和页面之间的关系。这将允许新查询利用索引。

像这样:

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.idid 独特的数字,与您所有的 1.
  3. 不同