Выбрать весь товар с фотками и без, подобрав товар по фоткам.

Alexos

Новичок
Выбрать весь товар с фотками и без, подобрав товар по фоткам.

Есть таблица товаров
CREATE TABLE `items` (
`item_id` int(11) unsigned NOT NULL auto_increment,
`articul` varchar(255) NOT NULL default '',
`name_item` varchar(255) NOT NULL default '',
`price` decimal(11,2) NOT NULL default '0.00',
PRIMARY KEY (`item_id`)
)

Есть таблица с ID фоток
CREATE TABLE `cat_img` (
`id` int(11) unsigned NOT NULL auto_increment,
`file_size` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
)

Есть таблица, хранящая связи между айди товаров и соответствующих им фоток
CREATE TABLE `links_img` (
`id` int(11) unsigned NOT NULL auto_increment,
`item_id` int(11) default NULL,
`img_id` int(11) default NULL,
PRIMARY KEY (`id`)
)


Мне нужно вывести весь товар и и подобрать строки (т.е. отсортировать) по первому встречающемуся в таблице links_img изображению. Т.е. даже если у товара нету ниодной фотки его тоже нужно включить в этот список. Я делаю такой запрос - все подбирается как надо, но выводятся только товары с фотками, а товары у которых фоток нет , не выводятся! :(
[sql]
SELECT * FROM items as a, links_img as b
WHERE a.item_id=b.item_id
GROUP BY a.item_id
ORDER BY b.img_id DESC
[/sql]

Как решить задачку?
Сорри, если коряво изложил! Спросите - поясню.

PS Уважаемые модераторы, если одним запросом тут не обойтись и нужно вплетать php, не переносите плз в форум по Муське.

-~{}~ 23.06.05 01:58:

Здается мне, что косяк вот в этом условии WHERE a.item_id = b.item_id. Это условие говорит о том, что нужно выбирать только те товары, ID которых связаны с картинками, т.е. присутствуют в таблице links_img !!!
Как вывести все товары, но подобрать по фоткам? Что нужно исправить в запросе?
 

flash-vkv

Новичок
не уверин попробуй убрать
WHERE a.item_id = b.item_id

-~{}~ 23.06.05 12:45:

не уверин попробуй убрать
WHERE a.item_id = b.item_id
 

tashkentchi

Новичок
PHP:
SELECT * 
FROM items AS a
LEFT JOIN links_img AS b ON a.item_id = b.item_id
GROUP BY a.item_id
ORDER BY b.img_id DESC
 

Alexos

Новичок
tashkentchi
Спасибо. Всё ок теперь.
Но до меня не доходит почему твой запрос выводит все товары, а мой только товары с картинками?
Ведь твой запрос в принципе аналог моего только с использованием JOIN.. Выходит я ошибался. Но в чем разница тогда объясните..
 

tashkentchi

Новичок
> с использованием JOIN..

С использованием LEFT JOIN. А ты использовал INNER JOIN. Здесь большая разница

Выражение "A LEFT JOIN B" в MySQL реализовано следующим образом:
* Таблица B устанавливается как зависимая от таблицы A и от всех таблиц, от которых зависит A.
* Таблица A устанавливается как зависимая ото всех таблиц (кроме B), которые используются в условии LEFT JOIN.
* Все условия LEFT JOIN перемещаются в предложение WHERE.
* Выполняются все стандартные способы оптимизации соединения, за исключением того, что таблица всегда читается после всех таблиц, от которых она зависит. Если имеется циклическая зависимость, MySQL выдаст ошибку.
* Выполняются все стандартные способы оптимизации WHERE.
* Если в таблице A имеется строка, соответствующая выражению WHERE, но в таблице B ни одна строка не удовлетворяет условию LEFT JOIN, генерируется дополнительная строка B, в которой все значения столбцов устанавливаются в NULL.
* Если LEFT JOIN используется для поиска тех строк, которые отсутствуют в некоторой таблице, и в предложении WHERE выполняется следующая проверка: column_name IS NULL, где column_name - столбец, который объявлен как NOT NULL, MySQL пререстанет искать строки (для отдельной комбинации ключа) после того, как найдет строку, соответствующую условию LEFT JOIN.
 
Сверху