MySQL GROUP BY选中列为空

时间:2015-04-21 15:25:13

标签: mysql

我有一个包含多个记录的数据库,我想要分组。例如:

cat_id | p_id | amount | sold | date       | title
---------------------------------------------
1      | 1    | 4      | 3    | 2015-04-21 | title of product 1
1      | 1    | 0      | 5    | 2015-04-03 | 
2      | 1    | 3      | 1    | 2015-04-21 | title of product 2
2      | 1    | 0      | 3    | 2015-04-05 | 

在此表中,有两个独特的产品,cat_id 1中的p_id 1和cat_id 1中的p_id 2。现在,我希望获得所有产品的所有列表,并将其amountsold相加。仅在数量> 1的情况下填写标题。 0。 所以我写了这个查询:

SELECT SUM (amount), SUM(sold) cat_id, p_id, title
FROM table
GROUP BY cat_id, p_id

这让我回报:

cat_id | p_id | amount | sold | title
---------------------------------------------
1      | 1    | 4      | 8    |
2      | 1    | 3      | 4    |

所以现在我错过了我的头衔。 我尝试了一些链接GROUP_CONCAT(DISTINCT title),但这种连接,并不是我真正想要的东西。我只需要标题。

我该如何解决这个问题。

注意:更新了问题

4 个答案:

答案 0 :(得分:1)

在标题周围添加MAX()将强制它选择NOT NULL值

SELECT SUM (amount), SUM(sold) cat_id, p_id, MAX(title)
FROM table
WHERE amount > 0
GROUP BY cat_id, p_id

答案 1 :(得分:1)

此处标题的基本问题是,如果您使用没有聚合函数的GROUP BY,则返回的值是不确定的(请参阅this question)。

所以你最好的选择是以某种方式解决这个问题 - 一个明显的解决方案是为每一行填写title,而不仅仅是数量在哪里> 0(甚至更好,规范化您的数据!)。但是,如果您不能这样做,您可以在GROUP_CONCAT中使用标题中不存在的分隔符(例如,“||||”),并且GROUP_CONCAT返回文本字段,您可以使用REPLACE来摆脱它:

SELECT SUM (amount), SUM(sold) cat_id, p_id, REPLACE(GROUP_CONCAT(DISTINCT title ORDER BY title DESC SEPARATOR '||||'), '||||', '') AS title
FROM table
GROUP BY cat_id, p_id

我制作了一个简化的SQL小提琴here,也许你可以随意使用它来做你想要的。

答案 2 :(得分:1)

您需要在标题上使用MAX(),以便拉出非空白或空的标题。看起来有点奇怪,虽然你的桌子是这样设计的......

SELECT SUM(amount), SUM(sold) cat_id, p_id, MAX(title) AS `Title`
FROM table
GROUP BY cat_id, p_id

答案 3 :(得分:0)

尝试:

SELECT SUM (amount), SUM(sold), cat_id, p_id, title
FROM table
GROUP BY cat_id

更新SQLFiddle:http://sqlfiddle.com/#!9/a5ca3/3

相关问题