2017-02-22 41 views
0

мой текущий запрос:MYSQL запрос из нескольких таблиц, где не всегда ПМК существуют во всех таблицах

select 
    item_description.fk_i_item_id, item_description.s_title, item_description.s_description, 
    category_description.s_slug, 
    item_resource.s_path, item_resource.s_extension, item_resource.pk_i_id 
FROM 
    item, item_description, category_description, item_resource 

WHERE 
    item.pk_i_id = item_description.fk_i_item_id 
AND 
    category_description.fk_i_category_id = 96 
AND 
    item.pk_i_id = item_resource.fk_i_item_id 

GROUP BY item.pk_i_id 
ORDER BY item.pk_i_id DESC 

В основном эти таблицы содержат данные некоторых элемента (с дополнительной информацией, хранящейся в item_resource), я m пытается получить всю полезную информацию из всех этих 4 таблиц, она работает хорошо, когда у элемента есть ресурс (дополнительная информация в item_resource), но если элемент не имеет ресурса, то элемент не появится на результат.

Так что мне нужен результат, когда элемент возвращается тоже независимо от того, имеет ли он информацию о таблице item_resource или нет.

ответ

1

Так что мне нужен результат, когда элемент возвращается тоже независимо от того, имеет ли он информацию о таблице item_resource или нет.

Затем рассмотреть возможность сделать OUTER JOIN и наиболее вероятно, LEFT OUTER JOIN вместо того, чтобы делать INNER JOIN. То, что вы сейчас выполняете, является внутренним соединением и синтаксисом старого стиля, когда вы говорите FROM item, item_description, category_description, item_resource. Вы должны скорее использовать синтаксис типа ANSI JOIN.

Кроме того, не видите необходимости в этом GROUP BY item.pk_i_id, так как вы не выполняете агрегацию.

Я имею в виду что-то вроде ниже:

select 
    item_description.fk_i_item_id, item_description.s_title, 
    item_description.s_description, 
    category_description.s_slug, 
    item_resource.s_path, item_resource.s_extension, item_resource.pk_i_id 
FROM 
    item 
LEFT JOIN item_description ON item.pk_i_id = item_description.fk_i_item_id 
LEFT JOIN category_description ON category_description.some_column = item.pk_i_id 
AND category_description.fk_i_category_id = 96 
LEFT JOIN item_resource ON item.pk_i_id = item_resource.fk_i_item_id 
ORDER BY item.pk_i_id DESC; 
+0

«GROUP BY item.pk_i_id» необходима, потому что иногда есть более чем на ресурс, так как в этом случае запись дублируется. добавив, что GROUP BY работает как шарм. СПАСИБО – Saymon