MySQL Forums
Forum List  »  Russian

SELECT FROM WHERE field1=a AND field1=b AND field1=N
Posted by: Dmitriy K
Date: December 13, 2010 05:18PM

Добрый день.

Речь идет о движке интернет-магазина OpenCart.
Выборка товаров с определенными опциями некоего фильтра.

Есть некий запрос примерно следующего вида:

= = = = SQL_CODE#1_START = = = =
SELECT
DISTINCT
p.product_id,
pd.name AS name
(... тут еще некоторые столбцы, упущенные ради уменьшения количества кода...)
FROM
product p
LEFT JOIN product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id)
LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id)
LEFT JOIN stock_status ss ON (p.stock_status_id = ss.stock_status_id)
LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id)
WHERE
p.status = '1'
AND
p.date_available <= NOW()
AND
pd.language_id = '1'
AND
p2s.store_id = '0'
AND
ss.language_id = '1'
AND
p2c.category_id = '18'
AND
p.product_id IN ('53', '54')
AND
p.product_id IN (SELECT product_id FROM product_to_value WHERE value_id = '21' OR value_id = '1')
ORDER BY
p.sort_order ASC
LIMIT
0,4;
= = = = SQL_CODE#1_END = = = =


Мне надо, чтобы вот этот участок кода:

= = = = SQL_CODE#2_START = = = =
AND
p.product_id IN (SELECT product_id FROM product_to_value WHERE value_id = '21' OR value_id = '1')
= = = = SQL_CODE#2_END = = = =


работал примерно следующим образом:

= = = = CODE#3_START = = = =
выбрать все продукты, у которых
( option_id_1 [value_id = 2 AND value_id = 3 AND value_id = 7] )
AND
( option_id_4 [value_id = 2 AND value_id = 4 AND value_id = 5] )
AND
( option_id_N [value_id = n AND value_id = n AND value_id = n] )
= = = = CODE#3_END = = = =


Пробовал делать так

= = = = CODE#4_START = = = =
AND p.product_id IN (SELECT product_id FROM product_to_value WHERE value_id = '21' AND value_id = '1')
= = = = CODE#4_END = = = =


В ответ получаю "Empty set (0.00 sec)" в консоли и соответственно отсутствие товаров на странице.

Хотел было пощупать UNION, но не придумал как его использовать хотя бы для теста.

Значений для подстановки к value_id может быть 0, 1 или более.
В данный момент в запрос они попадают таким образом:

= = = = CODE#5_END = = = =
// check for options, etc
if (isset($values) && $values != '') {
$data = array();

foreach (explode('_', $values) as $value_id) {
$data[] = "value_id = '" . (int)$value_id . "'";
}

$sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE " . implode(" OR ", $data) . ")";
}
= = = = CODE#5_END = = = =

Буду признателен за какую-либо помощь в формировании запроса или отсылу к документации по функциям/выражениям/еще_чему, которые смогут помочь мне решить данную "проблемку".

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

- - -
С уважением,
Дмитрий

Options: ReplyQuote


Subject
Views
Written By
Posted
SELECT FROM WHERE field1=a AND field1=b AND field1=N
24326
December 13, 2010 05:18PM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.