2013-09-24 3 views
1

Я застрял на наилучшем пути для выполнения этого запроса MySQL.Данные MySQL должны существовать в двух столбцах, которые будут возвращены

У меня есть три таблицы:

продукты - это список продуктов

id | product_name 

кошки - это список категорий

id | category_name 

cats_selected - несколько категорий могут быть assig в эту таблицу перечислены

cat_id | product_id 

В поиске пользователь может выбрать несколько категорий для поиска сразу. Я хочу проверить, существует ли продукт в каждой категории, поэтому он должен соответствовать cat_id и product_id. Идентификатор cat размещен как массив.

Каков наилучший способ запроса этих данных?

Например, следующее не работает по очевидным причинам:

SELECT * 
FROM products 
JOIN cats_selected 
ON cats_selected.product_id = products.id 
AND cats_selected.cat_id = '16372' 
AND cats_selected.cat_id = '9' 

ответ

2
SELECT p.id 
FROM products p 
JOIN cats_selected s ON s.product_id = p.id 
where s.cat_id in (16372, 9) 
group by p.id 
having count(distinct s.cat_id) = 2 
+0

> = 2, вероятно, лучше? – allen213

+0

@ allen213: Это не обязательно, поскольку есть ** точно ** 2 разных 'cat_id' из-за предложения' where'. –

+0

Не уверен, что я согласен с тем, что он сказал несколько вопросов, а не 2 в вопросительном органе, хотя у данных образца, конечно, есть 2 элемента. Я читаю как минимум два. – allen213

0

ли эта работа? Синтаксис запроса неверен.

SELECT * 
FROM products 
JOIN cats_selected 
ON cats_selected.product_id = products.id 
WHERE cats_selected.cat_id IN ('16372', '9') 
0

Предполагая, что массив вашего cat_id выглядит что-то вроде [1,2,4,3,52] вы можете использовать функцию, и вы должны иметь cats_selected.cat_id проверки в части WHERE

$cat_ids = [1,2,4,3,52]; 
$catImplode = implode(",",$cat_ids); 

$query = <<<END 
    SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats 
    FROM products 
    JOIN cats_selected 
    ON cats_selected.product_id = products.id 
    WHERE cats_selected.cat_id IN ($catImplode) 
    GROUP BY products.id 
END; 

Это в конечном итоге $ запрос существа:

SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats 
FROM products 
JOIN cats_selected 
ON cats_selected.product_id = products.id 
WHERE cats_selected.cat_id IN (1,2,4,3,52) 
GROUP BY products.id 

Добавлен столбец GROUP_CONCAT псевдонимами в cats в случае, если вам нужно знать, какие категории, которые соответствуют продукту

Смежные вопросы