MySQL GROUP,除非值等于0

时间:2016-10-22 15:32:59

标签: mysql sql

我想要一个将结果分组在一起的查询,除非job_num = 0的值,但我一直无法弄清楚如何去做。

这是我的查询(并且不起作用,我收到SQL错误)...

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

我尝试用job_num != 0替换job_num IS NOT NULL并获得相同的结果。

在我尝试排除job_num != 0

之前,查询的其余部分正常工作

这是表格的简化版本

id | call_ref | job_num
_______________________

1  | 123445   | 2389
_______________________

2  | 342537   | 0
_______________________

3  | 876483   | 2389
_______________________

4  | 644686   | 5643
_______________________

5  | 654532   | 0

我想将job_num!= 0的行分组,但我仍然希望显示job_num = 0的行,而不是组合在一起。 call_ref不是唯一的,表格中还有31列需要值。

使用上面的示例行和ID 1和3将被分组,2,4和5仍会返回结果但不会分组。

我想要的结果......

1和3分组(因为job_nums是相同的但是!= 0) 2,4,5未分组

5 个答案:

答案 0 :(得分:1)

如果您在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;

答案 1 :(得分:1)

你能用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);

答案 2 :(得分:0)

基于此评论:

  

@mcNets因为理想情况下我想用job_num显示结果   != 0,我只是不希望结果与该值组合在一起

你不想要group by(虽然我不明白“那个值”指的是什么)。我注意到这与问题的第一句话直接矛盾。

这样做你想要的吗?

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;

编辑:

我觉得你可能只想要值为0的行一起出现而其余的一起出现。如果是这种情况,请将条件放在ORDER BY

SELECT SQL_CALC_FOUND_ROWS c.*
FROM calls c
WHERE c.parent_id = '$term' 
ORDER BY (job_num = 0), date_start DESC
LIMIT $page_position, $item_per_page;

答案 3 :(得分:0)

试试这个

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

答案 4 :(得分:0)

您可以将派生表用于主查询,然后将FS用于要显示多行的表。例如:

order

在此查询中,最终ord是使行显示不止一次的LEFT JOIN,尽管有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返回LEFT JOIN

的内容显示列