2014-10-25 2 views
1

Я проверил несколько потоков здесь и не могу найти ответ на свой вопрос .... Я пытаюсь выполнить запрос mysql с несколькими таблицами и левым присоединиться к последней таблице. Это не нравится левое соединение и не дает мне никаких результатов, когда я его включаю. Любая помощь очень ценится :)Mysql несколько таблиц left join last table

(я использую Joomla)

query = "SELECT DISTINCT u.id as uid, CONCAT(u.first_name,' ',u.last_name) as name1, 
u.grad as grad, u.opt_out as opt_out 
FROM #__bl_teams as t, #__bl_regions as r, #__users as u 
LEFT JOIN #__bl_paid as pd ON pd.u_id = u.id 

WHERE u.team_id = t.id AND u.team_id != '' AND u.s_id = $sid 
AND ((t.id = $tid)OR($tid=0)) AND (t.id IN ($teamsfull)) 
AND ((t.id IN(".$tc_teams."))OR(".$tc_id." = 0)) 
AND ((r.id = ".$mid.")OR(".$mid." = 0)) 
AND ((r.s_id = ".$sid.")OR(".$mid." = 0)) 
AND ((FIND_IN_SET(t.id,r.teams))OR(".$mid." = 0)) 
AND u.id NOT IN($paidrows) AND u.id NOT IN ($rsrows) GROUP BY u.id"; 
    $db->setQuery($query, $pageNav->limitstart, $pageNav->limit); 
    $rows50 = $db->loadObjectList(); 
+0

Почему вы смешиваете старые стили и стиль «новый» (1992)? Разве это не было бы более читаемым, если бы вы использовали 'inner join' для других объединений? Что касается вашей проблемы, я не вижу каких-либо непосредственных синтаксических ошибок, но может быть, есть ошибка (неправильное имя таблицы?), Из-за чего запрос терпит неудачу. Если этот отказ не проверен правильно, может показаться, что запрос не возвращает строк. – GolezTrol

+0

Я проверил имена таблиц, и они верны – user1071915

ответ

-1

Я не знаю ctual таблицы, но этот запрос слишком долго и будет иметь неожиданные результаты результаты. В любом случае, Left также присоединиться к другим таблицам.

query = "SELECT DISTINCT u.id as uid, CONCAT(u.first_name,' ',u.last_name) as name1, 
u.grad as grad, u.opt_out as opt_out 

FROM #__users as u 

LEFT JOIN #__bl_paid as pd ON pd.u_id = u.id 
LEFT JOIN #__bl_teams as t ON t.u_id = u.id 
LEFT JOIN #__bl_regions as r ON r.u_id = u.id 

WHERE u.team_id != '' 
AND u.s_id = $sid 
AND ((t.id = $tid) 
OR($tid=0)) 
AND (t.id IN ($teamsfull)) 
AND ((t.id IN(".$tc_teams.")) 
OR(".$tc_id." = 0)) 
AND ((r.id = ".$mid.") 
OR(".$mid." = 0)) 
AND ((r.s_id = ".$sid.") 
OR(".$mid." = 0)) 
AND ((FIND_IN_SET(t.id,r.teams)) 
OR(".$mid." = 0)) 
AND u.id NOT IN($paidrows) 
AND u.id NOT IN ($rsrows) 
GROUP BY u.id"; 
+0

* «этот запрос слишком длинный и будет иметь неожиданные результаты» * - На основании чего? Этот запрос почти не подталкивает ограничения в терминах «долготы». Кроме того, ваше изменение превращает старые стильные внутренние соединения в левые соединения, в то время как эта часть должна работать так, как есть. – GolezTrol

+0

Попробуйте и скажите, если это работает –

+0

Я пытаюсь сейчас – user1071915

0

Вы смешиваете соединения старого стиля и присоединяетесь к новому стилю. Это твоя проблема. Табличные псевдонимы не распознаются в заявлении from, как вы ожидаете. Похоронен в documentation это предупреждение:

Тем не менее, приоритет оператора запятой меньше внутреннего JOIN, CROSS JOIN, LEFT JOIN, и так далее. Если вы смешиваете запятую с другими типами соединений при условии соединения, может возникнуть ошибка формы Неизвестный столбец «col_name» в разделе «on». Информация о решении этой проблемы приводится ниже в этом разделе.

Простое правило: никогда не используйте запятые в предложении from.

Итак, перепишите свой запрос, используя явные соединения, и это устранит проблему.