2016-06-03 4 views
2

left сказать, например, что у меня есть следующий запрос и вы хотите ограничить left join на столе, как мне это достичь?mysql - limit left join

SELECT * FROM Base 
LEFT JOIN Derived1 ON Base.id = Derived1.id 
LEFT JOIN Derived2 ON Base.id = Derived2.id 
LEFT JOIN Derived3 ON (Base.id = Derived3.id WHERE Derived3.name LIKE 'test%' LIMIT 5) <----- 
WHERE Base.id = 'someid'; 

я, хотя я мог бы написать это следующим образом:

SELECT * FROM Base 
LEFT JOIN Derived1 ON Base.id = Derived1.id 
LEFT JOIN Derived2 ON Base.id = Derived2.id 
LEFT JOIN Derived3 ON Base.id = (
    SELECT d3.id FROM Derived3 d3 
    WHERE d3.name LIKE 'test%' AND Base.id = Derived3.id 
    LIMIT 5 
) 
WHERE Base.id = 'someid'; 

, но это дает мне неправильный результат

Я хочу, чтобы все данные, которые внутри Derived3, но только 5 предметов, если Derived.name соответствует test 1, test 2, test 3 и т. Д. Возможно, существует 100 000 000 тестов e, что таблицы и несколько тысяч других вещей, которые не начинаются с 'test'.

Итак, дайте мне что-нибудь внутри Derived3 и не более 5 строк, начинающихся с 'test'.

Как это решить?

+0

Каждый раз, когда вы перечисляете таблицы или столбцы, будильники должны начинать звонить. – Strawberry

+0

Тревожные звонки звонили и теперь сломаны, мне действительно нужно исправить, не меняя структуру, так как у нас есть миллиарды записей, и это несколько огромный проект. Поэтому мне нужно придумать хороший запрос, хотя это может быть не самый эффективный способ решения этой проблемы. –

+0

Выберите ur Baseid из Derived3, сохраняя все ваши условия соединения и соединения intactand, если это работает @ Dr.Jones –

ответ

0

Посмотрите нижеприведенный запрос.

SELECT * 
FROM Base 
LEFT JOIN Derived1 ON Base.id = Derived1.id 
LEFT JOIN Derived2 ON Base.id = Derived2.id 
LEFT JOIN Derived3 ON (
     Base.id = Derived3.id 
     AND Derived3.id IN (
      SELECT Derived3.id 
      FROM Derived3 
      WHERE Derived3.NAME LIKE 'test%' LIMIT 5 
      ) 
     ) 
WHERE Base.id = 'someid' 
+0

Я не могу запустить ограничение внутри IN/ANY, так как его не поддерживается =/ –

0

Я не уверен, если это может поместиться в вашем сценарии, но вы можете выбрать из Derived3 с помощью фильтра LIKE 'test%' и присоединиться выберите результат, используя псевдоним.

Я не MySql установлен, чтобы попробовать это, но что-то, как это должно работать:

SELECT * FROM Base 
LEFT JOIN Derived1 ON Base.id = Derived1.id 
LEFT JOIN Derived2 ON Base.id = Derived2.id 
LEFT JOIN (
    SELECT d3.id FROM Derived3 d3 
    WHERE d3.name LIKE 'test%' 
    LIMIT 5 
) Derived3Alias ON Base.id = Derived3Alias.id 
WHERE Base.id = 'someid' 
GROUP BY Base.id; 

Возможно, вам нужно будет написать «как Derived3Alias», но попробуйте сначала без «как» Я думаю, что он должен работать ,

+0

Я не могу даже описать это, потому что это берет навсегда ... Это действительно правильно? –

+0

Извините, предыдущая ссылка неверна (я удалил комментарий) .. Это правильный вариант http://sqlfiddle.com/#!9/f17b7c/9 – hellwd

+0

Если вы откроете последнюю ссылку, я также добавил группу test1.id (Base.id в вашем случае) .. Я не уверен, что вам это нужно или нет – hellwd