MySQL组,除非值等于0
我想要一个将结果分组在一起的查询,除非job_num的值=0,但我无法确定如何执行该查询 这是我目前的查询(不起作用,我得到一个SQL错误) 我已尝试替换MySQL组,除非值等于0,mysql,sql,Mysql,Sql,我想要一个将结果分组在一起的查询,除非job_num的值=0,但我无法确定如何执行该查询 这是我目前的查询(不起作用,我得到一个SQL错误) 我已尝试替换job\u num!=0withjob_num不为NULL并获得相同的结果 在我尝试排除job_num!=0 这是该表的简化版本 id | call_ref | job_num _______________________ 1 | 123445 | 2389 _______________________ 2 | 342537
job\u num!=0
withjob_num不为NULL
并获得相同的结果
在我尝试排除job_num!=0
这是该表的简化版本
id | call_ref | job_num
_______________________
1 | 123445 | 2389
_______________________
2 | 342537 | 0
_______________________
3 | 876483 | 2389
_______________________
4 | 644686 | 5643
_______________________
5 | 654532 | 0
我想将作业_num!=0,但我仍然希望显示job_num=0未分组在一起的行。call_ref不是唯一的,表中还有31列我需要的值
使用上面的示例,ID为1和3的行将被分组,2、4和5仍将返回结果,但不会分组
结果我想
1和3分组(因为作业数量相同,但!=0)
2、4、5未分组如果在PHP代码中使用此请求,请尝试
SELECT SQL_CALC_FOUND_ROWS FROM calls
WHERE parent_id = \'$term\' GROUP BY IF job_num <> 0
ORDER BY date_start DESC LIMIT $page_position, $item_per_page;
从调用中选择SQL\u CALC\u FOUND\u行
其中,父项\u id=\'$term\'分组依据IF job\u num 0
订单按日期开始描述限制$page\u位置,$item\u每页;
基于此评论:
@因为理想情况下我想用job_num显示结果 != 0,我只是不希望将具有该值的结果分组在一起 您不希望按
分组(尽管我不理解“该值”指的是什么)。我确实注意到这与问题的第一句直接矛盾
这是你想要的吗
SELECT SQL_CALC_FOUND_ROWS c.*
FROM calls c
WHERE c.parent_id = '$term' AND job_num <> 0
ORDER BY date_start DESC
LIMIT $page_position, $item_per_page;
你能用UNION试试吗
(SELECT SQL_CALC_FOUND_ROWS * FROM calls
WHERE parent_id = '$term' where job_num != 0 GROUP BY (job_num)
ORDER BY date_start DESC LIMIT $page_position, $item_per_page)
UNION
(SELECT SQL_CALC_FOUND_ROWS * FROM calls
WHERE parent_id = '$term' where job_num = 0
ORDER BY date_start DESC LIMIT $page_position, $item_per_page);
试试这个
SELECT *
FROM
(SELECT SQL_CALC_FOUND_ROWS *
FROM calls
WHERE parent_id = '$term'
AND job_num != 0
GROUP BY job_num
UNION SELECT SQL_CALC_FOUND_ROWS *
FROM calls
WHERE parent_id = '$term'
AND job_num = 0) AS T
ORDER BY date_start DESC LIMIT $page_position,
$item_per_page
您可以将派生表用于主查询,然后将其左键联接到要显示多行的表上。例如:
SELECT *
FROM (
SELECT a.account_id 'CRM ID', a.lead_status 'Status', a.account_name 'Client Name', DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), INTERVAL a.date_of_birth SECOND), '%d-%m-%Y') AS 'DOB', a.postcode 'Postcode',
a.phone 'Phone #.', a.email 'Email', IFNULL(i.invoice_date, 'Never') AS 'Last Invoice'
FROM mydb.invoices i
RIGHT JOIN mydb.members m ON i.member_id = m.member_id
RIGHT JOIN mydb.accounts a ON m.crm_id = a.account_id
WHERE (i.invoice_status LIKE 'SAVE%' OR i.invoice_date IS NULL)
AND a.lead_status IN ('SIGNED UP', 'BILLING')
AND a.account_position != 'DELETED'
GROUP BY a.account_id
) x
LEFT JOIN mydb.account_owners o ON x.`CRM ID` = o.account_id
在该查询中,最后的左连接是使行显示多次的连接,尽管有分组依据,例如:
旁白:忽略上面查询中的列具有“友好”名称这一事实。此查询来自一个报告工具,该工具根据SQL返回的内容显示列。:)
提供了示例数据和所需结果。将select*
与groupby
一起使用简直是毫无意义的。为什么不把job_num!=where子句中的0?@mcNets,因为理想情况下,我希望使用job_num!显示结果0,我只是不希望将具有该值的结果分组together@GordonLinoff这个表有34列,所以可能需要一些时间…@tatty27。select
中的所有未聚合列应位于分组依据中。你的问题很不清楚。示例数据和所需结果将有所帮助。谢谢,但在“job_num!”附近出现语法错误0 ORDER ByThank,但它不显示job_num!=0我需要结果按job_num将结果分组,其中job_num!=0,但我仍然需要它来显示job_num=0行。我会在我的问题中解释更多。@tatty27。这将清楚地显示job_num
不是0的行。这是在where
子句中。是的,它是,但我想看到job_num为0的行,只是没有组合在一起。我希望将具有匹配job_num值的行分组,但job_num=0的行未分组。谢谢,但在联合后出现语法错误。感谢您的帮助:)我将进一步查看UNION选项,看看错误在哪里。@tatty27我已根据mysql文档对其进行了修改。我不会对答案投反对票。但这一个应该是,因为它正在使用SELECT*
和groupby
@GordonLinoff,因为问题中没有列的名称。
SELECT *
FROM
(SELECT SQL_CALC_FOUND_ROWS *
FROM calls
WHERE parent_id = '$term'
AND job_num != 0
GROUP BY job_num
UNION SELECT SQL_CALC_FOUND_ROWS *
FROM calls
WHERE parent_id = '$term'
AND job_num = 0) AS T
ORDER BY date_start DESC LIMIT $page_position,
$item_per_page
SELECT *
FROM (
SELECT a.account_id 'CRM ID', a.lead_status 'Status', a.account_name 'Client Name', DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), INTERVAL a.date_of_birth SECOND), '%d-%m-%Y') AS 'DOB', a.postcode 'Postcode',
a.phone 'Phone #.', a.email 'Email', IFNULL(i.invoice_date, 'Never') AS 'Last Invoice'
FROM mydb.invoices i
RIGHT JOIN mydb.members m ON i.member_id = m.member_id
RIGHT JOIN mydb.accounts a ON m.crm_id = a.account_id
WHERE (i.invoice_status LIKE 'SAVE%' OR i.invoice_date IS NULL)
AND a.lead_status IN ('SIGNED UP', 'BILLING')
AND a.account_position != 'DELETED'
GROUP BY a.account_id
) x
LEFT JOIN mydb.account_owners o ON x.`CRM ID` = o.account_id