我在mysql中使用以下查询
SELECT count(c.id), u.id FROM users AS u
INNER JOIN zipcode_users_1_c AS zu ON zu.zipcode_users_1users_idb = u.id
LEFT JOIN zipcode AS z ON z.id = zu.zipcode_users_1zipcode_ida
LEFT JOIN branches AS b ON u.branch_id = b.id
LEFT JOIN branches_loan_1_c AS bl ON b.id = bl.branches_loan_1branches_ida
LEFT JOIN loan AS l ON l.id = bl.branches_loan_1loan_idb
LEFT JOIN accounts_loan_1_c AS al ON l.id = al.accounts_loan_1loan_idb
LEFT JOIN accounts AS a ON a.id = accounts_loan_1accounts_ida
LEFT JOIN cases_cstm as cc on u.id = cc.user_id_c
LEFT JOIN cases as c on cc.id_c = c.id
AND u.deleted = 0 AND zu.deleted = 0 AND z.deleted = 0 AND bl.deleted = 0 AND b.deleted = 0 AND AND l.deleted = 0 AND al.deleted = 0 AND a.deleted = 0 and c.deleted = 0 WHERE l.id = '34599008-3931-a6e1-b736-5795f5e9ff0b' AND z.code = a.billing_address_postalcode AND u.status = 'Active' group by u.id
我得到了这个结果
+-------------+--------------------------------------+
| count(c.id) | id |
+-------------+--------------------------------------+
| 4 | 40fc0f12-97a5-cd06-cf42-57961a48ee28 |
| 0 | 84ce03df-dc38-6920-e4d4-543792545b5a |
| 3 | 88f6a311-9f15-c50e-cf09-5753e764dd18 |
| 0 | 46ce0bd2-dc28-6921-24d4-547792515346 |
+-------------+--------------------------------------+
现在,这里我只想要那些count(c.id)非常低的记录,即在这种情况下,只有两个记录,其中count(c.id)为0.我期待使用min()功能,但我得到"无效使用组功能"错误,如果我使用min()函数与count()函数。所以,请在这里指导我。谢谢。
答案 0 :(得分:1)
您应该更好地格式化查询。将连接条件放在它们所属的连接中,不是,就像这样
LEFT JOIN cases as c on cc.id_c = c.id
AND u.deleted = 0 AND zu.deleted = 0 AND z.deleted = 0 AND bl.deleted = 0
然后在您的where
条款中,您的条件会将left join
转换为inner join
s。
要解决您的问题,请将您的查询放在子查询中。 manual有一个很好的条目,解释了如何解决您的问题:
引用:
任务:对于每篇文章,找到价格最贵的经销商或经销商。
这个问题可以通过像这样的子查询来解决:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
前面的示例使用相关子查询,这可能是低效的(请参见第13.2.10.7节“相关子查询”)。解决问题的其他可能性是在FROM子句或LEFT JOIN中使用不相关的子查询。
不相关的子查询:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price;
LEFT JOIN:
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;
LEFT JOIN的工作原理是,当s1.price处于最大值时,没有s2.price具有更大的值,s2行值将为NULL。
<强>澄清:强>
为了更容易说明,我创建了一个查询视图,如下所示:
CREATE VIEW foo AS
SELECT count(c.id) AS cnt, .../*the rest of your query*/
现在,您需要计数的最小值()..
SELECT MIN(cnt) FROM foo;
现在您需要与此值对应的行。
SELECT * FROM foo
WHERE cnt = (SELECT MIN(cnt) FROM foo);
答案 1 :(得分:0)
你如何使用min()函数和count()函数?
我建议你试试这个:
SELECT MIN(cnt) FROM (SELECT COUNT(c.id) cnt, u.id /* .. etc same as before... */)
虽然我不能自己尝试,但我认为它应该有效。请告诉我们。