0

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

所以我试图:

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

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

目前我只得到一排,而不是我期待的 3 排。

我究竟做错了什么?或者我什至可以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)

4

2 回答 2

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
于 2013-06-07T07:22:31.730 回答
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

我改成UNIONUNION ALL,因为UNION暗示了一个DISTINCT。我不认为,这就是你想要的(甚至需要,UNION ALL也更快,因为它不必检查是否有重复的行)。

请注意,*按某事进行选择和分组实际上是不好的做法。通过对 中未提及的列进行分组而不使用聚合函数,group by为每个组选择随机行以进行显示。只是想提一下。

于 2013-06-07T08:14:07.700 回答