2015-07-08 4 views
-1

Я реализую разбивку на страницы на своем BD. Моя проблема в том, что я хочу ограничить оператор SELECT, но не JOIN. Например, продукт может получить много цен:SQL limit SELECT, но не JOIN

SELECT * FROM product 
LEFT JOIN price ON product.id == price.id_product 
LIMIT 20 

Но я хочу получить 20 продуктов с каждой ценой. Как я могу ограничить оператор SELECT, но не LEFT JOIN.

Пример:

product    price.id price.id_pruct price.price 
    1     1   1    50 
    2     2   1    30 
    3     3   1    40 
         4   1    20 
         5   2    30 

SELECT * FROM product 
LEFT JOIN price ON product.id == price.id_product 
LIMIT 3 

Возврат:

product price.id id_prodcut price 
1   1   1  50 
1   2   1  30 
1   3   1  40 

Но я хочу

product price.id id_prodcut price 
1   1   1  50 
1   2   1  30 
1   3   1  40 
1   4   1  20 
2   5   2  30 
3   .   .  . 

Три продукты (3) предельные

Спасибо. Я надеюсь, что вы можете мне помочь.

+0

Возможный дубликат http://stackoverflow.com/questions/3348705/how-to-limit-results-of-a-left-join – sandeepKumar

+0

и см. Это также http://stackoverflow.com/questions/5126653/ mysql-inner-join-with-limit-to-left-table – sandeepKumar

ответ

2

Я хотел бы написать подзапрос, чтобы получить три первые продукты (или что условие вы выбираете), как это:

SELECT id 
FROM product 
ORDER BY id 
LIMIT 3; 

После того, как я есть, что я могу выбрать все из таблицы цен, пока ид находится в этом подзапросе. Вы можете сделать это с помощью объединения:

SELECT p.* 
FROM price p 
JOIN(
    SELECT id 
    FROM product 
    ORDER BY id 
    LIMIT 3) tmp ON tmp.id = p.product_id; 

Вот SQL Fiddle пример с использованием данных выборки, и я также добавил строку, которая не будет возвращена, так что вы можете видеть, что это работает.

+0

mmm Я думаю, что это решение: изменение порядка SELECT. – jlmg5564

+0

Я думал, что было какое-то утверждение или комбинация скобок для решения проблемы. – jlmg5564

+0

@ jlmg5564 Не понимаю. Порядок столбцов, поскольку они записаны в инструкции select, не имеет значения, это имеет значение только для показа. И это заявление для решения проблемы, ответ содержит ссылку на пример, показывающий, что он сработал. Если это не то, что вы хотите, ваш вопрос неясен для меня. – AdamMc331

3

Измените свой запрос, чтобы ограничить количество рядов продуктов до его присоединения к таблице цен. Это означает, что мы хотим, чтобы присоединиться к результатам запроса к таблице, или другими словами, мы пишем запрос, содержащий подзапрос:

SELECT * 
FROM (
    SELECT * 
    FROM product 
    ORDER BY id_product 
    LIMIT 3 
) p 
LEFT JOIN price ON p.id = price.id_product 

Надежда, что помогает.

+0

Я не спускал вниз, но я подозреваю, причина в том, что ответы на код часто не рекомендуется на StackOverflow. Пожалуйста, отредактируйте, чтобы объяснить свой ответ. Кроме того, было бы неплохо заказать ваш подзапрос, чтобы вы знали, какие три результата вы получаете, а оператор сравнения должен иметь один знак равенства. – AdamMc331

+0

Скорректировано, спасибо – reaanb

+0

Nice edit, upvote from me. :) – AdamMc331