如何在mysql中使用min函数获得所需的输出?

时间:2016-07-28 08:57:54

标签: mysql

我在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()函数。所以,请在这里指导我。谢谢。

2 个答案:

答案 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... */)

虽然我不能自己尝试,但我认为它应该有效。请告诉我们。