2010-08-18 2 views
0

У меня есть база данных списков. У меня также есть база данных listings_attributes, которая выглядит следующим образом:Поиск данных столбцов в таблице MySQL

id | listing_id | attribute_id 

В принципе в listings_attributes таблице хранятся атрибуты, которые назначены на определенный список.

Я хочу фильтровать списки в зависимости от того, какие атрибуты у них есть.

Примером может быть я хочу найти все списки с атрибутом_ид из 1. Это очень просто.

SELECT l.id FROM listings AS l 
    LEFT JOIN listings_attributes AS la ON l.id = la.listing_id 
    WHERE la.attribute_id = 1 
    GROUP BY l.id 

Что моя проблема в том, как я достаю списки, которые имеют в attribute_id от 1 и 2. Если есть списки с attribute_id 1, но не имеет attribute_id из 2, я не хотите, чтобы их вытащили из базы данных.

Однако, если есть списки с атрибутом_id из 1, 2 и 3, я бы хотел, чтобы их вытащили из базы данных.

Вот мой SQL, с которым я играл, но «OR» между атрибутами не работает, и ни «AND», ни «AND».

SELECT l.id FROM listings AS l 
    LEFT JOIN listings_attributes AS la ON l.id = la.listing_id 
    WHERE (la.attribute_id = 1 OR la.attribute_id = 2) 
    GROUP BY l.id 

Какой код мне нужен, чтобы он работал так, как я объяснил выше?

ответ

1

При поиске нескольких атрибутов вам необходимо использовать GROUP BY с OR, чтобы убедиться, что атрибуты существуют в таблице listings_attributes, как и у вас уже есть. Затем вы добавляете предложение HAVING, чтобы убедиться, что соответствует несколько строк. Нравится так:

SELECT l.id FROM listings AS l 
    LEFT JOIN listings_attributes AS la ON l.id = la.listing_id 
    WHERE (la.attribute_id = 1 OR la.attribute_id = 2) 
    GROUP BY l.id HAVING COUNT(*) = 2 
+0

Thanks Chris! Есть ли способ сделать HAVING COUNT (*) = 2 более конкретным? У меня на самом деле есть несколько LEFT JOINS в моем коде, и я думаю, что это может быть запутано. –

+0

На самом деле, я думаю, что я просто ошибаюсь. Похоже, он работает :) Спасибо за вашу помощь! –

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