2012-09-20 2 views
0

Я проверил прежние посты и никто не решить мою проблему пока, любая помощь будет оцененаMysql Регистрация для 3 столов

MYSQL запрос 3 таблицы (пользователи, матч, интервью)

Хотите вернуть имя пользователя и интервью # (если есть номер интервью) для указанного Матча.

Но я не хочу ограничивать результаты только тем, у кого есть собеседование. Я попробовал JOIN, но не могу заставить его работать на 3 таблицы.

Вот то, что я до сих пор в PHP:

$query = "SELECT CONCAT(u.first_name,' ',u.last_name,'----',COALESCE(i.v_code,'')) as name, u.id as id 
FROM #__users as u 

JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 

JOIN #__bl_interview as i ON i.u_id = u.id"; 

     $db->setQuery($query); 
    $parti12 = $db->loadObjectList(); 
+3

Вы попробовали ВЛЕВО? JOIN будет получать только пользователей, у которых есть соответствующая сущность (ы) в таблице соединения. – Tool

+0

Просто изменил его. Но теперь он не показывает имена пользователей, просто пробелы в раскрывающемся списке – user1071915

+0

Попробуйте добавить LEFT JOIN в таблицу #__bl_match. – Tool

ответ

0

Если вы хотите пользователей без интервью, вы должны будете использовать LEFT JOIN к столу интервью, но это означает, что количество интервью для этот пользователь будет NULL.

Поскольку вы объединяете номер с именем пользователя в списке SELECT, это приводит к тому, что имя пользователя возвращается как NULL, когда у них нет интервью (поскольку конкатенация строки со значением NULL - или выполнение довольно практически любая другая операция по значению NULL - дает результат NULL).

Чтобы избежать этого, вы должны обращаться с корпусом, когда i.v_code имеет значение NULL. Обычный способ сделать это в MySQL это с COALESCE function:

SELECT CONCAT(u.first_name, ' ', u.last_name, '----', COALESCE(i.v_code,'')) as name, 
     u.id as id 
FROM #__users as u 
JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 
LEFT JOIN #__bl_interview as i ON i.u_id = u.id" 

Теперь, учитывая форматирование вы претендуете на имя, вы можете оставить с посторонней после имени, без последующего кода интервью. Если вы хотите, чтобы избежать этого, мы можем использовать IF вместо COALESCE, чтобы получить немного умнее, с нашей продукцией, например, так:

SELECT CONCAT(u.first_name, ' ', u.last_name, IF(i.v_code, '---- ' + i.v_code, '')) as name 

Обратите внимание, что это делает: если i.v_code не NULL, первое выражение в IF оценивает значение true, поэтому возвращается второе выражение. В противном случае возвращается третье выражение (пустая строка), поэтому, когда i.v_code имеет значение NULL, вы выводите только имя пользователя.

Смежные вопросы