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

Форум MySQL

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

 

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

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

тема: Простой запрос
 
 автор: Denandi   (27.11.2013 в 16:19)   письмо автору
 
 

Всем привет!
впал в ступор. Не могу сделать подобие фильтра у товаров!
вот упрощенный запрос:

SELECT `id_test` FROM `test` WHERE 
(
(`id_attr` =2 AND `id_val`=7) 
AND 
(`id_attr` =3 AND `id_val`=27) 
AND 
(`id_attr`=1 AND `value` = 'a:1:{i:0;s:1:"4";}')
... и.т.д.
)

задача: выбрать id по (атрибут=значение)

*** одиночная конструкция, работает - `id_attr` =2 AND `id_val`=7 , а в комбинации - нет
В чем ошибка?
Спасибо.

  Ответить  
 
 автор: Sfinks   (28.11.2013 в 08:28)   письмо автору
 
   для: Denandi   (27.11.2013 в 16:19)
 

Ошибка в том, что `id_attr` не может одновременно быть равно и 1 и 2 и 3 и т.д.
Если у вас выбор по одной таблице по нескольким условиям одновременно, то ее (таблицу) нужно перемножать саму на себя столько раз, сколько условий используется.
SELECT *
FROM `test` AS t1
CROSS JOIN `test` AS t2
CROSS JOIN `test` AS t3
WHERE  
t1.`id_attr` =2 AND t1.`id_val`=7 AND  
t2.`id_attr` =3 AND t2.`id_val`=27 AND  
t3.`id_attr` =1 AND t3.`value` = 'a:1:{i:0;s:1:"4";}'

  Ответить  
 
 автор: Denandi   (28.11.2013 в 10:06)   письмо автору
 
   для: Sfinks   (28.11.2013 в 08:28)
 

Нет слов, одни эмоции. Затея рушится на глазах...
Но, тем ни менее - спасибо за подсказку, если б не вы сам бы не додумался. Знание - сила.

  Ответить  
 
 автор: Denandi   (02.12.2013 в 09:54)   письмо автору
 
   для: Sfinks   (28.11.2013 в 08:28)
 

>Ошибка в том, что `id_attr` не может одновременно быть равно и 1 и 2 и 3 и т.д.
вот еще один запрос, опять уперся в этот AND!!! что в этот раз, ведь одинаковых полей нет!
реально не понимаю, ну не алис же ляпать?! - erow AS er ...

SELECT `t`.`id_tov`
FROM `product` `t`
LEFT OUTER JOIN `erow` e ON ( e.`id_tov` = `t`.`id_tov` )
WHERE 
t.id_attr =4
AND e.`value` = 'a:1:{i:0;s:1:"4";}'
AND e.`id_val` IN (7,27)
LIMIT 0 , 30

  Ответить  
 
 автор: Sfinks   (03.12.2013 в 09:42)   письмо автору
 
   для: Denandi   (02.12.2013 в 09:54)
 

А что не так? Не выдает результат? А он есть?
Попробуйте просто вывести всю промежуточную таблицу и найти там результат, удовлетворяющий вашим условиям:
/*
1. OUTER можно не писать
2. Если поля, по которым идет объединение называются одинаково, можно использовать USING()
*/
SELECT *
FROM `product` `t` 
LEFT JOIN `erow` `e` USING(`id_tov`)

> ну не алис же ляпать?! - erow AS er ...
А он у вас не сляпан?
`erow` e
и
erow AS er
это одно и то же.

P.S. Под новые вопросы лучше заводить новую тему.

  Ответить  
 
 автор: Igorek   (28.11.2013 в 21:32)   письмо автору
 
   для: Denandi   (27.11.2013 в 16:19)
 

Можно так еще:
select id_test from test
where (id_attr = 2 and id_val = 7) OR (id_attr = 3 and id_val = 27)
group by id_test
having count(id_test) = 2/*Кол-во условий*/

  Ответить  
 
 автор: Sfinks   (30.11.2013 в 10:24)   письмо автору
 
   для: Igorek   (28.11.2013 в 21:32)
 

Вы снова правы!
И по нагрузке ваш запрос намного легче.....
Старею =)

  Ответить  
 
 автор: kosta_in_net   (04.12.2013 в 22:12)   письмо автору
 
   для: Sfinks   (30.11.2013 в 10:24)
 

и на старуху найдется проруха. Там же сразу очевидно было. что пары нужно через "или" объединять!

  Ответить  
Rambler's Top100
вверх

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