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()
例如:(这是我需要的结果)
- 第1324234324页有1张图片1个视频
- 第4545647777页有2张图片0个视频
- 第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 个小时了,我不知道:-(
试试这个:
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`
注:
PAGEID
是 archer
列,ACTION
是 archer
.
PAGEID
和 CONTENT.id
是 id
独特的数字,与您所有的 1
. 不同
我必须使用 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()例如:(这是我需要的结果)
- 第1324234324页有1张图片1个视频
- 第4545647777页有2张图片0个视频
- 第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 个小时了,我不知道:-(
试试这个:
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`
注:
PAGEID
是archer
列,ACTION
是archer
.PAGEID
和CONTENT.id
是id
独特的数字,与您所有的1
. 不同