php - 按这个或那个分组

标签 php mysql group-by

我有一个网络应用程序,它使用 Facebook ID 或联系人编号作为参与者标识符。这是因为客户不希望那些没有 F​​acebook 的人错过进入(因此有一个 Web 应用程序和一个 Facebook 应用程序)

所以我正在尝试:

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

基本上,我想要实现的是选择 is_daily_winner = 2 的条目每个 fbid 小于或等于 4 行或contact_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)

最佳答案

这个应该可以满足您的要求:

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 中未提及的列进行分组且不使用聚合函数,将为每个组挑选随机行进行显示。只是想提一下。

关于php - 按这个或那个分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16978310/

相关文章:

MYSQL - 根据行号查找记录

mysql - 多个表的内部联接产生错误

mysql - 如何对查询中的结果进行分组?

sql - SUM 和 GROUP BY 生成的列上的 MAX

php - PHP 上的事件。可能吗?

php - 检索属于两个指定日期的日期

php - 自然数范围问题

php - Codeigniter - Facebook - JQuery Mobile 问题

mysql - 在sql中按升序对 "Apr-19" "Apr-18"日期类型进行排序

python - Pandas 数据框到字典