2013-04-17 3 views
0

Вот запрос, который работает почти:MySQL запрос не возвращает результат, если данные не в таблице

$query = ''; 
$query .= ' SELECT highway_code.charge_id, 
     highway_code.act_abbr, 
     highway_code.short_form_wording, 
     highway_code.section, 
     highway_code.set_fine, 
     highway_code_arrest_jail_tow.demerits 
     '; 
$query .= ' FROM highway_code, highway_code_arrest_jail_tow '; 
$query .= ' WHERE highway_code.charge_id = ? '; 
$query .= ' AND highway_code.section = highway_code_arrest_jail_tow.section '; 
$query .= ' AND highway_code.act_abbr = highway_code_arrest_jail_tow.act_abbr '; 

Проблема в том, что не все расходы шоссе кода имеют недостатки, поэтому любые обвинения без недостатков не возвращаются, даже если применяются все остальные поля. Я хотел бы, чтобы все сборы были возвращены независимо от того, есть ли значение в highway_code_arrest_jail_tow.

+0

Вам нужен 'ЛЕВЫЙ JOIN' вместо неявного' ВНУТРЕННЕЙ JOIN' вы здесь (с помощью имен таблиц, разделенных запятыми) отзыв http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html –

+0

Благодарим вас за ссылку. Я думаю, это лучшее объяснение, которое я видел по этой теме. Однако, будучи новичком с ограниченным опытом создания SQL-заявлений, я не уверен, как я его выписал ... Сейчас я начинаю делать исследования, но если решение прост, не возражаете ли вы публиковать сообщения? Tks! –

ответ

2

Использование таблиц с разделителями-запятыми в предложении FROM, как и у вас, с условием равенства между соответствующими столбцами подразумевает INNER JOIN. Чтобы принудительно использовать все записи, возвращаемые из основной таблицы, независимо от наличия связанных записей в связанной таблице, вместо этого используйте LEFT JOIN.

я заменю подразумеваемого внутреннее соединение с явным LEFT JOIN:

SELECT 
    highway_code.charge_id, 
    highway_code.act_abbr, 
    highway_code.short_form_wording, 
    highway_code.section, 
    highway_code.set_fine, 
    highway_code_arrest_jail_tow.demerits 
FROM 
    highway_code 
    LEFT JOIN highway_code_arrest_jail_tow 
    /* Two relating conditions belong in the ON clause */ 
    ON highway_code.section = highway_code_arrest_jail_tow.section 
    AND highway_code.act_abbr = highway_code_arrest_jail_tow.act_abbr 
WHERE 
    /* and the filtering condition remains in the WHERE */ 
    highway_code.charge_id = ? 
+0

Вы, сэр, потрясающие. Я был так близок, это было ГДЕ в конце, с которым я жонглировал. Большое спасибо Майклу. –