GROUP BY此OR

时间:2013-06-07 07:14:11

标签: php mysql group-by

我有一个使用Facebook ID或Contact#作为参赛者标识符的网络应用程序。这是因为客户不希望没有Facebook的人错过进入(所以有一个网络应用程序以及一个Facebook应用程序)

所以我想:

SELECT *, COUNT(*) 
FROM `entries_table` 
WHERE is_daily_winner = 2 
GROUP BY fbid OR contact_no 
HAVING COUNT(*) <=4

基本上,我想要实现的是选择is_daily_winner = 2的条目小于或等于每fbidcontact_no的4行。

目前我只退回一行,而不是我期待的那一行。

我做错了什么?或者我甚至可以GROUP BY x OR y

编辑:我正在扩展这个问题,因为我忘了包含另一个条款。

HAVING COUNT(*) <=4应该跨越所有条目,但我只需要在最后一天内输入。{ 我刚刚尝试过:

SELECT * FROM `entries_table` 
WHERE `timestamp` >= (CURDATE() - INTERVAL 1 DAY) IN
  (SELECT * FROM `entries_table` 
   WHERE is_daily_winner = 2 
   GROUP BY fbid 
   HAVING COUNT(*) <=4
   UNION
   SELECT * FROM `entries_table` 
   WHERE is_daily_winner = 2
   GROUP BY contact_no 
   HAVING COUNT(*) <= 4)

我收到错误Operand should contain 1 column(s)

2 个答案:

答案 0 :(得分:1)

您可以更好地使用 UNION ,如

SELECT *, COUNT(*) 
   FROM `entries_table` 
   WHERE is_daily_winner = 2 
   GROUP BY fbid
   HAVING COUNT(*) <=4
UNION
SELECT *, COUNT(*) 
   FROM `entries_table` 
   WHERE is_daily_winner = 2 
   GROUP BY contact_no
   HAVING COUNT(*) <=4

答案 1 :(得分:1)

这个应该做你想做的事:

SELECT * FROM (
   SELECT *, COUNT(*) AS nr FROM `entries_table` 
   WHERE is_daily_winner = 2 
   AND `timestamp` >= (CURDATE() - INTERVAL 1 DAY)
   GROUP BY fbid 
   UNION ALL
   SELECT *, COUNT(*) AS nr FROM `entries_table` 
   WHERE is_daily_winner = 2
   AND `timestamp` >= (CURDATE() - INTERVAL 1 DAY)
   GROUP BY contact_no 
) sq 
WHERE nr <= 4

我将UNION更改为UNION ALL,因为UNION意味着DISTINCT。我不认为,这就是你想要的(甚至是需要的,UNION ALL也更快,因为它不必检查是否有重复的行。)

请注意,选择*并按某种方式分组实际上是不好的做法。通过对group by中未提及的列进行分组并且没有聚合函数,将为每个组选择随机行以进行显示。只是想提一下。