限制随机返回的 ID,但每个 ID 的行数未知
Limit random returned id's, but with unknown row count per id
我想 select 从我的数据库中随机抽取 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
问题是:我不想限制 returned 的行,我只想限制不同的 customer_id。
但是因为我必须随机 select 它们,所以我不能使用数学(例如 "WHERE customer_id < 6")。
有没有办法在同一查询中随机 select 5 位客户和 return 他们所有的 food_preferences?
您可以在子查询中限制客户,然后然后执行 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;
首先,从不在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
我想 select 从我的数据库中随机抽取 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
问题是:我不想限制 returned 的行,我只想限制不同的 customer_id。 但是因为我必须随机 select 它们,所以我不能使用数学(例如 "WHERE customer_id < 6")。 有没有办法在同一查询中随机 select 5 位客户和 return 他们所有的 food_preferences?
您可以在子查询中限制客户,然后然后执行 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;
首先,从不在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