php - 限制随机返回的 id,但每个 id 的行数未知

标签 php mysql random row limit

我想从我的数据库中随机选择 5 个用户并显示他们所有的食物偏好。

目前我有这些表:

CUSTOMERS
customer_id email 

FOOD_PREFERENCE
food_id food_name allergic_info

LISTING
customer_id food_id

我的查询必须与此类似:

SELECT c.email, f.food_name, f.allergic_info
FROM customers c, food_preference f, listing l
WHERE l.customer_id=c.customer_id AND f.food_id=l.food_id
ORDER BY rand(c.customer_id) LIMIT 10

问题是:我不想限制返回的行,我只想限制不同的 customer_id。 但是因为我必须随机选择它们,所以我不能使用数学(例如“WHERE customer_id < 6”)。 有没有办法随机选择 5 个客户并在同一查询中返回他们的所有 food_preferences?

最佳答案

首先,永远不要FROM子句中使用逗号。 始终使用显式JOIN语法。

所以,您的查询应该是:

SELECT c.email, f.food_name, f.allergic_info
FROM listing l JOIN
     customers c  
     ON l.customer_id = c.customer_id JOIN
     food_preference f
     ON f.food_id = l.food_id
ORDER BY rand(c.customer_id)  -- I don't know why you are providing a see here
LIMIT 10;

如果所有客户都有食物偏好,只需将 limit 放入子查询中即可:

SELECT c.email, f.food_name, f.allergic_info
FROM listing l JOIN
     (SELECT c.*
      FROM customers c  
      ORDER BY rand()
      LIMIT 5
     ) c
     ON l.customer_id = c.customer_id JOIN
     food_preference f
     ON f.food_id = l.food_id;

如果并非所有客户都在 listing 中,而您只希望客户在 listing 中,那么您可以添加另一个加入:

SELECT c.email, f.food_name, f.allergic_info
FROM listing l JOIN
     customers c
     ON l.customer_id = c.customer_id JOIN
     food_preference f
     ON f.food_id = l.food_id JOIN
     (SELECT customer_id
      FROM (SELECT DISTINCT customer_id FROM LISTING) lc
      ORDER BY rand()
      LIMIT 5
     ) lc
     ON l.customer_id = lc.customer_id

关于php - 限制随机返回的 id,但每个 id 的行数未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189451/

相关文章:

c - C中生成随机数的函数

c++-default_random_engine 始终创建相同的数字系列

php - mysql_num_rows 抛出警告并且不继续

php - 将 jQuery UI Datepicker 选择的日期获取到 PHP session 变量?

php - 声明类型提示时,PhpStorm是否允许跳过PHPDoc标记?

php - 向检查过 'yes' - php 和 modx 的用户发送电子邮件

php - 如何使用 PHP 一次将数据插入两个 mysql 表中

mysql - 类型转换、转换还是定制?

php - 同一请求中 curl 管道 $_POST 和 $_FILES 的问题

sql - 为每组选择随机行