Как такое вообще может быть (PHP+MySQL)?

12
Asar
На сайте с 23.08.2004
Offline
334
812

Запрос:

SELECT *

FROM T1

LEFT JOIN T2 ON T1.Id = T2.SpId

WHERE Active =1

AND PreDesc != ''

ORDER BY Capt, Caption

LIMIT 0, 50

В результате некоторые объекты (уникальные Id) выдает два раза. Если убрать LEFT JOIN, то все Ок. Одноименных полей в таблицах T1 и T2 нет. MySQL ошибок нет. Как такое может быть, в чем проблема? Всю голову поломал, никак не догоню...

I0
На сайте с 05.10.2009
Offline
16
#1

Потому что, при указании LEFT JOIN - выполняется LEFT OUTER JOIN, если вообще без JOIN, т.е WHERE t1.some_id=t2.other_id, конструкция эквивалентна INNER JOIN ON... Что и требуется в данном случае.

Asar
На сайте с 23.08.2004
Offline
334
#2

Хм. А с чего мне тут нужен INNER? Нужен как раз LEFT, чтобы все значения из T1 брались, в т.ч. те, для которых нет соответствия в T2.

I0
На сайте с 05.10.2009
Offline
16
#3

Ну так в случае LEFT JOIN строки для значений из левой таблицы, которым нет соответствия в правой, будут присутствовать в результате выборки с полями из правой таблицы установленными в NULL, отсюда и строки с повторяющимися id. Или речь о том, что в результате присутствуют полные дубли строк?

Asar
На сайте с 23.08.2004
Offline
334
#4
ilya067:
Ну так в случае LEFT JOIN строки для значений из левой таблицы, которым нет соответствия в правой, будут присутствовать в результате выборки с полями из правой таблицы установленными в NULL

Мне так и нужно.

ilya067:

Или речь о том, что в результате присутствуют полные дубли строк?

Вот именно.

I0
На сайте с 05.10.2009
Offline
16
#5

На самом деле перепутал по поводу LEFT JOIN, в случае если действительно поля id уникальные в обоих таблицах, то повторяющихся в выборке быть не должно. Надо бы на describe таблиц взглянуть. И еще какая версия mysql?

Asar
На сайте с 23.08.2004
Offline
334
#6

Версия 5.0.77.

Повторы идут там, где во второй таблице несколько одинаковых значений SpId. Т.е. ощущение, как будто пашет RIGHT JOIN, а не LEFT.

Ragnarok
На сайте с 25.06.2010
Offline
239
#7

что если добавить distinct?..

//TODO: перестать откладывать на потом
Asar
На сайте с 23.08.2004
Offline
334
#8
Ragnarok:
что если добавить distinct?..

А куды его там?

rbbumfirst
На сайте с 03.04.2009
Offline
87
#9

select distinct ...

Web developer (http://rudov.com). разработка на Go, ReactJS, React Native
Asar
На сайте с 23.08.2004
Offline
334
#10

Так при Select Distinct на выходе других полей ж вообще не будет. Т.е., в случае РНР, будет массив с одним полем (которое Distinct), а не со всеми мне необходимыми.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий