Jump to content
  • 0

select несколько пар условий из одной таблицы


bgraf
 Share

Question

Добрый день!

Есть таблица

 

id_product int

id_propertie int

select_value int

 

Мне нужно сделать select в котором может быть несколько пар, я имею ввиду 

id_propertie = 100 and select_value = 2 

и

id_propertie = 200 and select_value = 1

и

id_propertie = 300 and select_value = 8

 

я дел так (id_propertie = 100 and select_value = 2) and (id_propertie = 200 and select_value = 1) and (id_propertie = 300 and select_value = 8)

 

))не работает

смысл в том, что из таблицы надо достать все id_product, в которых есть все условия по парно.

Спасибо большое за помощь!

 

 

Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

Дело в том ,что у product может быть несколько properties и соответственно values ,мне надо вытащить все products, которые отвечают этим нескольким условиям сразу ,а не одному из них

вот такой вариант
id_product id_propertie select_value
10011111 98 3
20022222 98 3
10011111 75 2
20022222 75 4
надо показать все id_product у которых id_propertie = 98 а select_value = 3 и id_propertie = 75 а select_value = 4
исходя из моей задачи я должен получить только id_product = 20022222
как сделать такой селект

Edited by bgraf
Link to comment
Share on other sites

  • 0

хм даже предположить не могу как составить такой запрос

у меня есть две таблицы одна t1 в которой данные товара и перечень общих для всех товаров проперти и вторая t2 таблица в которой все проперти

вот теперь делаем

select *

from t1

inner join t2 on t1.id_product = t2.id_product

where t1.product_style = 3

and t2.propertie_product = 99 and t2.value = 3

 

а вот подскажите куда здесь еще left join вставить

спасибо Вам

Link to comment
Share on other sites

  • 0

Вам по сути нужно сделать три запроса. по каждому из пунктов.
 

SELECT *FROM table t1LEFT JOIN table t2  LEFT JOIN table t3  WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 ANDt3.id_propertie = 300 AND t3.select_value = 8 

Возможно есть простой вариант, даже я думаю что он есть - только сходу не припомню ))

UPD  не правильно )) вариант выше будет тот же что и OR

возможно через IF и ваш первый вариант.  погуглите про этот оператор

Link to comment
Share on other sites

  • 0

Все вам правильно по-ходу написали, используйте OR

(`id_propertie` = 100 AND `select_value` = 2)OR(`id_propertie` = 200 AND `select_value` = 1)OR(`id_propertie` = 300 AND `select_value` = 8)

Как бы только запрос не получился жирным как Ж орангутанга 

Edited by nomalware
  • Like 1
Link to comment
Share on other sites

  • 0

Все вам правильно по-ходу написали, используйте OR

(`id_propertie` = 100 AND `select_value` = 2)OR(`id_propertie` = 200 AND `select_value` = 1)OR(`id_propertie` = 300 AND `select_value` = 8)
Как бы только запрос не получился жирным как Ж орангутанга

В этом случае сработает один или два и три условия а мне надо чтобы сработали только три условия показать товары которые отвечают всем трём или не показывать этот товар
Link to comment
Share on other sites

  • 0

Тогда AND должно нормально работать.

 

Вы где-то мудрите


Сделайте сначала запрос за id карточек товаров, потом пробуйте тянуть все остальное, может все проще

Edited by nomalware
Link to comment
Share on other sites

  • 0

В этом случае сработает один или два и три условия а мне надо чтобы сработали только три условия показать товары которые отвечают всем трём или не показывать этот товар

Как то вы заморочились ...

 

SELECT DISTINCT *FROM table t1LEFT JOIN table t2  ON (t2.product_id = t1.product_id)LEFT JOIN table t3  ON (t3.product_id = t1.product_id)WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 AND  t3.id_propertie = 300 AND t3.select_value = 8 
Link to comment
Share on other sites

  • 0

 

В этом случае сработает один или два и три условия а мне надо чтобы сработали только три условия показать товары которые отвечают всем трём или не показывать этот товар

Как то вы заморочились ...

 

SELECT DISTINCT *FROM table t1LEFT JOIN table t2  ON (t2.product_id = t1.product_id)LEFT JOIN table t3  ON (t3.product_id = t1.product_id)WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 AND  t3.id_propertie = 300 AND t3.select_value = 8 

не то слово заморочился, но задача показать те товары, которые отвечаю запросу и если есть 3-4-10 условий то товары должны отвечать всем или он не подходит, на том и стою ))))))) Вам огромное спасибо за ответы, пробую, тружусь, если будут еще мысли буду признателен Вам!!!!

Link to comment
Share on other sites

  • 0

чтобы не открывать новую тему, дополню свой вопрос.

селект, который я вояю будет достаточно громоздкий, и еще он будет использовать LIMIT по количеству товаров показываемых на странице.

к этому хозяйству, хотелось бы показать пользователю, сколько товаров нашлось по его запросу.

использовать mysqli_num_rows не могу из за LIMIT (всегда максимальное число будет равняться этому ограничению), а использовать count(*) значит нагрузить сервер еще раз этим сложным запросом, можно не использовать LIMIT и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

Как бы Вы поступили на моем месте, спасибо всем за мнение!!!

Link to comment
Share on other sites

  • 0

Столкнулся с похожим вопросом:

нужно было получить записи из БД WordPress из таблицы postmeta

 

Суть в том что разные дополнительные поля в WP хранятся в одних столбцах, т.е.

в столбце meta_key есть значения например product_number и product_price ( пары их значений хранятся соответственно в другом столбце  meta_value )

Чтобы вытащить данные по значениям двух произв. полей подошел вариант с вложенный запросом.

 

Ниже код, может пригодится

SELECT post_idFROM postmetaWHEREpost_id IN (    SELECT post_id    FROM postmeta    WHERE    meta_key = 'product_number'  AND  meta_value LIKE '%$keywords%'    )                ANDmeta_key = 'product_price' AND meta_value > 1000

 

Link to comment
Share on other sites

  • 0

чтобы не открывать новую тему, дополню свой вопрос.

селект, который я вояю будет достаточно громоздкий, и еще он будет использовать LIMIT по количеству товаров показываемых на странице.

к этому хозяйству, хотелось бы показать пользователю, сколько товаров нашлось по его запросу.

использовать mysqli_num_rows не могу из за LIMIT (всегда максимальное число будет равняться этому ограничению), а использовать count(*) значит нагрузить сервер еще раз этим сложным запросом, можно не использовать LIMIT и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

Как бы Вы поступили на моем месте, спасибо всем за мнение!!!

1. Есть CALC_FOUND_ROWS или как-то так

2. Сложные запросы — плохо. Подумате, возможно, стоит упростить.

Link to comment
Share on other sites

  • 0

 

В этом случае сработает один или два и три условия а мне надо чтобы сработали только три условия показать товары которые отвечают всем трём или не показывать этот товар

Как то вы заморочились ...

 

SELECT DISTINCT *FROM table t1LEFT JOIN table t2  ON (t2.product_id = t1.product_id)LEFT JOIN table t3  ON (t3.product_id = t1.product_id)WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 AND  t3.id_propertie = 300 AND t3.select_value = 8 

 

​Если таблица товаров большая, то по идее может быть имеет смысл использовать EXISTS, например

SELECT * FROM table t

WHERE

EXISTS (SELECT 1 FROM table t1 WHERE t.product_id = t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2)

AND EXISTS (SELECT 1 FROM table t2 WHERE t.product_id = t2.product_id AND t2.id_propertie = 100 AND t2.select_value = 2)

AND EXISTS (SELECT 1 FROM table t3 WHERE t.product_id = t3.product_id AND t3.id_propertie = 100 AND t3.select_value = 8)

заодно уберем DISTINCT.

Если пары id_propertie и select_value встречаются только по одному разу, можно сделать через подзапрос

SELECT product_id FROM table t

WHERE

(

  SELECT product_id FROM table t1

  WHERE

    (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2)

    OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 3)

    OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 8)

  HAVING count(product_id) =3

) t2

WHERE t.product_id = t2.product_id

 

 

чтобы не открывать новую тему, дополню свой вопрос.

селект, который я вояю будет достаточно громоздкий, и еще он будет использовать LIMIT по количеству товаров показываемых на странице.

к этому хозяйству, хотелось бы показать пользователю, сколько товаров нашлось по его запросу.

использовать mysqli_num_rows не могу из за LIMIT (всегда максимальное число будет равняться этому ограничению), а использовать count(*) значит нагрузить сервер еще раз этим сложным запросом, можно не использовать LIMIT и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

Как бы Вы поступили на моем месте, спасибо всем за мнение!!!

​Если требуется показать колоичество записей в выборке, но не хочется выполнять громоздние запросы два раза - сохраните результат поиска во временной таблице, в пользователю покажите таблицу из нее и количество записей в ней.

Link to comment
Share on other sites

  • 0

У ТС думаю вообще задача не правильно поставлена.

Может я прав, но задача именно в том чтобы выдать количество товаров подходящих под поиск посетителя.

В этом случае сработает один или два и три условия а мне надо чтобы сработали только три условия показать товары которые отвечают всем трём или не показывать этот товар

Как то вы заморочились ...

 

SELECT DISTINCT *FROM table t1LEFT JOIN table t2  ON (t2.product_id = t1.product_id)LEFT JOIN table t3  ON (t3.product_id = t1.product_id)WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 AND  t3.id_propertie = 300 AND t3.select_value = 8 
 

​Если таблица товаров большая, то по идее может быть имеет смысл использовать EXISTS, например

SELECT * FROM table t

WHERE

EXISTS (SELECT 1 FROM table t1 WHERE t.product_id = t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2)

AND EXISTS (SELECT 1 FROM table t2 WHERE t.product_id = t2.product_id AND t2.id_propertie = 100 AND t2.select_value = 2)

AND EXISTS (SELECT 1 FROM table t3 WHERE t.product_id = t3.product_id AND t3.id_propertie = 100 AND t3.select_value = 8)

заодно уберем DISTINCT.

Если пары id_propertie и select_value встречаются только по одному разу, можно сделать через подзапрос

SELECT product_id FROM table t

WHERE

(

  SELECT product_id FROM table t1

  WHERE

    (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2)

    OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 3)

    OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 8)

  HAVING count(product_id) =3

) t2

WHERE t.product_id = t2.product_id

 

 

чтобы не открывать новую тему, дополню свой вопрос.

селект, который я вояю будет достаточно громоздкий, и еще он будет использовать LIMIT по количеству товаров показываемых на странице.

к этому хозяйству, хотелось бы показать пользователю, сколько товаров нашлось по его запросу.

использовать mysqli_num_rows не могу из за LIMIT (всегда максимальное число будет равняться этому ограничению), а использовать count(*) значит нагрузить сервер еще раз этим сложным запросом, можно не использовать LIMIT и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

Как бы Вы поступили на моем месте, спасибо всем за мнение!!!

​Если требуется показать колоичество записей в выборке, но не хочется выполнять громоздние запросы два раза - сохраните результат поиска во временной таблице, в пользователю покажите таблицу из нее и количество записей в ней.
А какая разница во времени между Джоин и экзист?

Подскажите а как сохранить во временной таблице? Квери приносит результат уже с лимитом

чтобы не открывать новую тему, дополню свой вопрос.

селект, который я вояю будет достаточно громоздкий, и еще он будет использовать LIMIT по количеству товаров показываемых на странице.

к этому хозяйству, хотелось бы показать пользователю, сколько товаров нашлось по его запросу.

использовать mysqli_num_rows не могу из за LIMIT (всегда максимальное число будет равняться этому ограничению), а использовать count(*) значит нагрузить сервер еще раз этим сложным запросом, можно не использовать LIMIT и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

Как бы Вы поступили на моем месте, спасибо всем за мнение!!!

1. Есть CALC_FOUND_ROWS или как-то так

2. Сложные запросы — плохо. Подумате, возможно, стоит упростить.

Согласен что это плохо но у меня нет возможности строить процедуру, с ней было бы проще
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy