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

时间:2017-02-12 15:31:25

标签: 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?

2 个答案:

答案 0 :(得分:1)

首先,从不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中的客户,那么您可以添加另一个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 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

答案 1 :(得分:0)

您可以在子查询中限制客户,然后然后执行JOIN。

此外,建议使用现代显式JOIN语法。

select c.email,
    f.food_name,
    f.allergic_info
from listing l
join (
    select *
    from customers
    order by rand() limit 10
    ) c on l.customer_id = c.customer_id
join food_preference f on f.food_id = l.food_id;