2017-02-12 17 views
0

Я хочу выбрать 5 случайных пользователей из моей базы данных и показать все их предпочтения в отношении пищи.Ограничить случайное число возвращаемых идентификаторов, но с неизвестным количеством строк на id

В настоящее время у меня есть эти таблицы:

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. Buts, так как я должен выбирать их случайным образом, я не могу использовать математику (например, «WHERE customer_id < 6»). Есть ли способ случайно выбрать 5 клиентов и вернуть все их food_preferences в рамках одного и того же запроса?

ответ

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 
0

Вы можете ограничить заказчик в подзапросе и , тогда выполните ОБЪЕДИНЕНИЯ.

Также рекомендуется использовать современный явный синтаксис 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;