Jump to content
  • Sign Up
Sign in to follow this  
bgraf

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

Recommended Posts

Добрый день!

Есть таблица

 

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, в которых есть все условия по парно.

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

 

 

Share this post


Link to post
Share on other sites

Дело в том ,что у 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

Share this post


Link to post
Share on other sites

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

у меня есть две таблицы одна 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 вставить

спасибо Вам

Share this post


Link to post
Share on other sites

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

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 и ваш первый вариант.  погуглите про этот оператор

Share this post


Link to post
Share on other sites

Все вам правильно по-ходу написали, используйте 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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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


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

Edited by nomalware

Share this post


Link to post
Share on other sites

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

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

 

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 

Share this post


Link to post
Share on other sites

 

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

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

 

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 условий то товары должны отвечать всем или он не подходит, на том и стою ))))))) Вам огромное спасибо за ответы, пробую, тружусь, если будут еще мысли буду признателен Вам!!!!

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

нужно было получить записи из БД 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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

 

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

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

 

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 и тогда шаманить и прыгать по принесенному результату селект, но это больше похоже на го...код(мне кажется).

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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. Сложные запросы — плохо. Подумате, возможно, стоит упростить.

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

Share this post


Link to post
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
Reply to this topic...

×   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.

Sign in to follow this  

  • Member Statistics

    46,897
    Total Members
    1,451
    Most Online
    Neovo
    Newest Member
    Neovo
    Joined
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Спрашивают сейчас

  • Пишут сейчас

    • Дорогие Друзья! Рад вам сообщить о выходе новой версии движка Flextype 0.9.9! В Flextype 0.9.9 достаточно много важных изменений определяющих — то как будет выглядеть финальная версия Flextype 1.0.0, к которой я иду уже более двух лет! Были пересмотрены, обновлены и переписаны ключевые моменты ядра, ответственные за работу с Записями, Коллекциями, Кешем и Rest API. Подробнее в статье: https://vk.com/@flextype-flextype-099-reliz Большое спасибо всем за то, что вы являетесь частью сообщества Flextype!
    • Привет! Меня зовут Евгения и я ищу талантливых программистов в компанию DevCube. https://mydevcube.com/ Это международная компания, которая занимается DevOps, web и software разработками. На данный момент в команду требуются Full stack .NET (Junior & Senior) — 3+ year of commercial experience; — Strong knowledge of Angular 5+; — Strong knowledge of Typescript; — Experience with HTML/HTML5, CSS/CSS3, SCSS; — Good understanding of Git; — Conversational English. Будет плюсом: VB experience Условия: Удаленная работа full-time Зарплата от 10-20$/час по результатам собеседования. Обязательное условие - быть на связи до 21-22:00 по Москве. Для отклика прошу писать на почту: evgeniia.ko@mydevcube.com
    • Привет! Меня зовут Евгения и я ищу талантливых программистов в компанию DevCube. https://mydevcube.com/ Это международная компания, которая занимается DevOps, web и software development. На данный момент в команду требуются PHP developers (Junior & Senior) Requirements: — 3+ year of commercial experience; — Strong knowledge PHP 7+ — Framework knowledge — Conversational English — CSS, Json, HTML5 Будет плюсом: Shopify implementation expertise. Условия: Удаленная работа full-time Зарплата от 10-20$/час по результатам собеседования. Обязательное условие - быть на связи до 21-22:00 по Москве. Для отклика прошу писать на почту: evgeniia.ko@mydevcube.com
  • Popular Contributors

    Nobody has received reputation this week.

×
×
  • Create New...