Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: mysql задача с join  (Прочитано 762 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Belyaev Nikolay

  • Автор темы
  • Активист
  • *
  • Сообщений: 734
    • Просмотр профиля
    • моя работа- дробилки, грохота...
mysql задача с join
« : 02 Апреля 2015, 00:35:22 »
приветствую!

mysql почти никогда не пользовался, но тут понадобилось написать запрос и... задача понимаю, что простая но не выходит :)
есть 3 таблицы
ps_feature_product
ps_feature_value_lang
ps_product

Идея в том чтобы объединить таблицы  ps_feature_product и ps_feature_value_lang по полю id_feature (это я сделал), а потом вычесть из списка всех продуктов ps_product.id_product все найденные продукты. Т.е. мне надо получить id_product, где нет поля id_feature=10

вот бред что я написал. я не понимаю синтаксиса сложно сочинённых запросов, когда несколько JOIN и where в одном запросе

SELECT `ps_product`.`id_product` FROM `ps_product`
LEFT OUTER JOIN (SELECT `ps_feature_product`.id_product FROM `ps_feature_value_lang`,`ps_feature_product` where `ps_feature_product`.`id_feature_value` = `ps_feature_value_lang`.`id_feature_value` AND `ps_feature_product`.`id_feature`=10 
)
 ON `ps_product`.`id_product` = `ps_feature_product`.`id_product`
"Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете"
Махатма Ганди

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: mysql задача с join
« Ответ #1 : 02 Апреля 2015, 10:48:14 »
Ничего сложного здесь нет.
Я рекомендую пользоваться псевдонимами для сокращения записей и упрощения.
Например характерный запрос из моих программ.
q = u'''SELECT t0.tag_id, t2.name 'Название тега', t4.name 'Шкаф', bays.name 'Раздел', t5.name 'Объект', t1.value 'Значение', t7.name 'Размерность', t3.name 'Качество', t6.text 'Примечание'
FROM currents t0
LEFT JOIN (tags t2) ON (t0.tag_id=t2.id)
LEFT JOIN (readdata t1, sections t4, bays, objects t5, texts t6, dimensions t7)
ON (t2.id=t1.tag_id AND t2.section_id=t4.id AND t2.bay_id=bays.id AND t2.object_id=t5.id AND t2.text_id=t6.id AND t2.dimension_id=t7.id)
LEFT JOIN (quality t3) ON (t1.quality_id=t3.id) WHERE (t0.page="'''+page+'")'
Или чуть поменьше
q = u'''SELECT t0.tag_id, t2.name, t3.text, t2.min, t2.max, dim.name
FROM headers t0
LEFT JOIN (tags t2) ON (t0.tag_id=t2.id)
LEFT JOIN (texts t3,dimensions dim) ON (t2.text_id=t3.id AND t2.dimension_id=dim.id)
WHERE (t0.page="%(p0)s")''' %{"p0":p}
А это с сортировкой
q=u'''SELECT t1.timestamp, t1.di1, t1.di2, t1.di3, t1.di4, t1.di5, t1.di6, t1.di7, t1.be7_a2, t1.be7_pa1, t1.be7_pv1, t1.be8_pa1, t1.be8_pv1, t1.be56_pa1, t1.zvu3_IREC, t1.zvu3_UBBR, t1.zvu4_IREC, t1.zvu4_UBBR, t1.noconn
FROM tagdata t1
%(where)sORDER BY %(sidx)s %(sord)s LIMIT %(start)s, %(limit)s''' %{"where":where, "sidx":sidx, "sord":sord, "start":start, "limit":limit}
Ничего заумного нет. Вы можете отработать и попробовать выполнять запросы в phpmyadmin. Я обычно в geany держу отрабатываемый и редактируемы запрос и просто копирую в phpmyadmin. Очень удобно и наглядно получается.
« Последнее редактирование: 02 Апреля 2015, 11:03:18 от alexander.pronin »

Оффлайн Belyaev Nikolay

  • Автор темы
  • Активист
  • *
  • Сообщений: 734
    • Просмотр профиля
    • моя работа- дробилки, грохота...
Re: mysql задача с join
« Ответ #2 : 02 Апреля 2015, 13:21:55 »
добрый человек! помоги пожалуйста
SELECT `ps_feature_product`.id_product FROM `ps_feature_product`,`ps_feature_value_lang` where (`ps_feature_product`.`id_feature_value` = `ps_feature_value_lang`.`id_feature_value` AND `ps_feature_product`.`id_feature` = '10')
LEFT JOIN (`ps_product`.`id_product`) ON `ps_product`.`id_product` = `ps_feature_product`.id_product
что я здесь неправильно сделал?
в первой строчке получил список всех продуктов с характеристикой 10, а теперь мне надо вычесть это множество из множества всех продуктов. Чтобы получить обделёные продукты без характеристики 10 :) вроде ж всё правильно написал! а меня отправляют читать manual к моей версии mysql


Пользователь решил продолжить мысль [time]02 Апрель 2015, 16:55:30[/time]:
SELECT `ps_feature_product`.id_product,`ps_product`.`id_product` FROM `ps_feature_product` INNER JOIN `ps_feature_value_lang` on (`ps_feature_product`.`id_feature_value` = `ps_feature_value_lang`.`id_feature_value` AND `ps_feature_product`.`id_feature` = '10') RIGHT OUTER JOIN (`ps_product`) ON (`ps_product`.`id_product` = `ps_feature_product`.id_product) WHERE `ps_feature_product`.id_product is NULL


по непонятной для меня причине where нельзя вставлять между Join'ами. так работает
« Последнее редактирование: 02 Апреля 2015, 15:59:11 от Belyaev Nikolay »
"Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете"
Махатма Ганди

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: mysql задача с join
« Ответ #3 : 07 Апреля 2015, 10:18:31 »
по непонятной для меня причине where нельзя вставлять между Join'ами.
Это синтаксис, правила выстраивания фраз. В английском, немецком языках аналогично. В русском можно все, но это наш менталитет такой.

 

Страница сгенерирована за 0.015 секунд. Запросов: 22.