Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Самообъединение
 
 автор: hammet   (16.04.2007 в 18:29)   письмо автору
 
 

Есть таблица товаров items с полями:
id, name, desc, art, color, image, assign, contents

Поле assign содержит id другого товара из той же самой таблицы.
Мне нужно одним запросом извлечь id, name, desc, art, color, image, contents
+ id,art ТОГО ТОВАРА, id которого записан в поле assign.

Другими словами я связываю товары в каталоге между собой, для каждого товара в поле assign я
записываю значение id товара с которым он связан.

Вопрос - как извлечь это одним запросом?

....спасибо.....

   
 
 автор: Trianon   (16.04.2007 в 18:35)   письмо автору
 
   для: hammet   (16.04.2007 в 18:29)
 


SELECT m.*, a.id AS aid, a.art AS aart 
FROM items AS m LEFT JOIN items AS a ON m.assign = a.id

   
 
 автор: hammet   (16.04.2007 в 18:48)   письмо автору
 
   для: Trianon   (16.04.2007 в 18:35)
 

Дело в том что у меня в запросе присутствует WHERE и GROUP BY...
Как с ними быть?

Изначально было так:

SELECT * FROM `kc_items` WHERE category=$id GROUP BY `name`,`desc`,`art`

   
 
 автор: Trianon   (16.04.2007 в 18:56)   письмо автору
 
   для: hammet   (16.04.2007 в 18:48)
 

SELECT * FROM `kc_items` WHERE category=$id GROUP BY `name`,`desc`,`art`


Так писать нельзя. Любой уважающий себя сервер Ваш запрос забракует.
Если Вы пришете GROUP BY, будьте любезны действительно написать группирующий запрос, где в списке селекта не бы ло бы никаких полей кроме текх, что в GROUP BY и агрегирующих функций (MAX, COUNT, SUM и т.п.) и был хотя бы один агрегат. Иначе непонятно, что именно Вы хотите извлечь.

   
 
 автор: Trianon   (16.04.2007 в 19:03)   письмо автору
 
   для: Trianon   (16.04.2007 в 18:56)
 

А что касается WHERE - ничто не мешает дописать в хвост:

WHERE m.category = $id

   
 
 автор: hammet   (16.04.2007 в 19:03)   письмо автору
 
   для: Trianon   (16.04.2007 в 18:56)
 

SELECT m.*, a.id AS aid, a.art AS aart
FROM `kc_items` AS m
LEFT JOIN `kc_items` AS a ON m.assign = a.id
WHERE m.cat_by_items=$id
GROUP BY m.name,m.desc,m.art
------------

Вот так работает.
Группировку по нескольким полям делаю, т.к. при записи в БД один товар может иметь например разные значения одного и того же поля. Приходится его дублировать, напр:
id name foo bar
----------------------
1 John 25 10
2 John 25 45
3 John 25 17

т.е. в этом примере группирую по полю bar


у меня же name,desc могут повторяться

   
 
 автор: Trianon   (16.04.2007 в 19:14)   письмо автору
 
   для: hammet   (16.04.2007 в 19:03)
 

Для этого нужно делать не GROUP а DISTINCT .
Группирующие запросы применяются совсем с другими целями.
Таблицы же стоит разделять, нормализуя отношения, а не дублировать данные в куче строк.

   
 
 автор: hammet   (16.04.2007 в 19:18)   письмо автору
 
   для: Trianon   (16.04.2007 в 19:14)
 

Спасибо за совет!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования