2014-02-17 4 views
3

Я пытаюсь получить определенное количество записей из таблицы вместе с соответствующими данными из другой таблицы:LEFT OUTER JOIN с LIMIT

SELECT a.*, b.* FROM tblA a 
    LEFT OUTER JOIN tblB b ON a.id = b.target WHERE ... ORDER BY ... LIMIT 0,40 

Он работает, но проблема заключается в том, что LIMIT, кажется, ограничить количество результатов, а не количество записей, которые я нахожу в A :(

Есть ли способ получить LIMIT, чтобы принимать во внимание только записи из A? Поскольку запись из A может иметь много связанных записей в B и Я не хочу ограничивать это

+0

Я хочу уточнить это утверждение: «запись из A может иметь много связанных записей в B, и я не хочу ограничивать это». Это означает, что вы хотите получить 40 записей из таблицы A. Это действительно то, что вы хотите, или вы хотите, чтобы до 40 записей с B на ключ в A? –

+0

да, это то, что я хочу. B может иметь любое количество записей, которые ссылаются на запись из A или не имеют. В основном B похож на метаданные для A. Поэтому я хочу запросить 40 записей из A и получить эти метаданные, если возможно, с тем же запросом – thelolcat

ответ

5

Попробуйте положить предел в подзапрос, а j на этом.

SELECT 
    * 
FROM 
(
    SELECT * FROM tblA WHERE ... ORDER BY ... LIMIT 0,40 
) 
    AS a 
LEFT JOIN 
    tblB AS b 
    ON a.id = b.target 

Многие РСУБД будут поддерживать это, я понятия не имею о SQLite.

+0

Невозможно использовать ORDER BY в подзапросе, но в противном случае на правильном пути. –

+0

Итак, нет способа сделать это с помощью ORDER? И что случилось с 'LEFT JOIN'? не будет ли игнорировать любые записи из A, которые не имеют связанных записей в B? – thelolcat

+1

@JoelCoehoorn - SQL Fiddle не согласен: http://sqlfiddle.com/#!7/d0a2d/45 – MatBailie