gpt4 book ai didi

MySQL 计算联合表中的行数

转载 作者:行者123 更新时间:2023-11-28 23:13:05 25 4
gpt4 key购买 nike

我想计算行数,在这种情况下,我想计算同一类别中的产品数量,如果该类别中没有产品,则返回零。

我的查询中的表如下所示:

category                    category_lang                 media
------------ ------------- ---------
category_id | published category_id | name | alias media_id | category_id
----------------------- -------------------------- ----------------------
1 | 1 1 | One | one 1 | 1
2 | 1 2 | Two | two 2 | 2
3 | 1 3 | Three| three 3 | 3

media_lang product_category
------------------------------- ----------------
media_id | url | file_name product_id | category_id
------------------------------- ------------------------
1 | /images/ | file1.jpg 1 | 1
2 | /images/ | file2.jpg 2 | 1
3 | /images/ | file3.jpg 3 | 2

我想要这样的结果:

category_id | category_name | alias | media_id | url      | file_name | count
1 | One | one | 1 | /images/ | file1.jpg | 2
2 | Two | two | 2 | /images/ | file2.jpg | 1
3 | Three | three | 3 | /images/ | file3.jpg | 0

我的查询目前看起来像这样

SELECT 
c.`category_id`,
ca.`name`,
ca.`alias`,
m.`media_id`,
ma.`url`,
ma.`file_name`,
COUNT(p.`product_id`) AS `count`
FROM `category` c
LEFT JOIN `category_lang` ca ON (c.`category_id` = ca.`category_id`)
LEFT JOIN `media` m ON (c.`category_id` = m.`category_id`)
LEFT JOIN `media_lang` ma ON (m.`media_id` = ma.`media_id`)
LEFT JOIN `product_category` p ON (c.`category_id` = p.`category_id`)
WHERE c.`published` = 1
ORDER BY ca.`name`

我的逻辑显然是错误的,因为这个查询将返回:

category_id | category_name | alias | media_id | url      | file_name | count
1 | One | one | 1 | /images/ | file1.jpg | 3

我怎样才能达到预期的效果?

最佳答案

我认为解决这个问题的最轻松(和理智)的方法是将 product_category 表中每个类别的产品计数聚合到一个单独的子查询中,然后将其连接到您已有的:

SELECT 
c.category_id,
ca.name,
ca.alias,
m.media_id,
ma.url,
ma.file_name,
COALESCE(t.cat_count, 0) AS cat_count
FROM category c
LEFT JOIN category_lang ca
ON c.category_id = ca.category_id
LEFT JOIN media m
ON c.category_id = m.category_id
LEFT JOIN media_lang ma
ON m.media_id = ma.media_id
LEFT JOIN
(
SELECT category_id, COUNT(*) AS cat_count
FROM product_category
GROUP BY category_id
) t
ON c.category_id = t.category_id
WHERE c.published = 1
ORDER BY ca.name

请注意,您的 product_category 表没有任何没有产品的类别条目。这不是问题,因为在 LEFT JOIN 中,我们可以简单地将 NULL 计数视为零。如果给定类别与子查询中的任何内容都不匹配,则会出现 NULL 值。

关于MySQL 计算联合表中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com