2017-02-12 1 views
0

데이터베이스에서 5 명의 무작위 사용자를 선택하고 모든 음식 선호도를 표시하려고합니다.임의로 반환 된 ID는 제한되지만 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를 제한하고 싶다. 하지만 무작위로 선택해야하기 때문에 수학을 사용할 수 없습니다 (예 : "WHERE customer_id < 6"). 5 명의 고객을 무작위로 선택하고 동일한 검색어 내에서 모든 food_preferences를 반환 할 수 있습니까?

답변

1

첫째, 결코 사용 쉼표. 항상은 명시 적 JOIN 구문을 사용합니다.

따라서, 귀하의 요청은 다음과 같아야합니다

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에 있고 당신 만하면 모든 고객이 음식의 기본 설정이있는 경우

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를 넣어 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을 수행합니다.

또한 현대 명시 적 JOIN 구문을 사용하는 것이 좋습니다. FROM 절에

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;