MySQL, как выбрать несколько атрибутов из декартова произведения?

Я пытаюсь получить несколько атрибутов (например, спальни, ванные комнаты и т. д.) из нескольких таблиц. Да, я могу получить только один атрибут с моим текущим запросом. Что мне не хватает?

В конечном итоге я пытаюсь найти объект property_id с 2 ванными комнатами и 2 спальнями. В этом случае мои желаемые результаты - это идентификаторы свойств 1 и 4.

Вот мой пример на sqlfiddle

Примеры таблиц:

property
--------
id 
1
2
3
4

attribute
---------
id name
1  bedrooms
2  bathrooms

attribute_value
---------------------
id attribute_id value
1  1            1
2  1            2
3  1            3
4  2            1
5  2            2
6  2            3

property_attributes
------------------------------
property_id attribute_value_id
1           2
1           5
2           2
2           4
3           1
3           4
4           2
4           5 

Этот запрос может дать нужные мне результаты, если я хочу увидеть запрос, основанный только на одном атрибуте:

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
IN (
SELECT av.attribute_value_id
FROM attribute_value av
INNER JOIN attribute a ON av.attribute_id = a.attribute_id
WHERE a.name like 'bedrooms' AND av.value like '2')

Но что я должен сделать, чтобы получить результаты с большим количеством атрибутов (например, ГДЕ имя, например «ванные комнаты», И среднее значение, например «2»)? Если я добавлю еще один подзапрос в основное предложение where, он не вернет никаких результатов.

/// РЕДАКТИРОВАНИЕ ///

вот решение, которое сработало для меня, если кто-то еще окажется в такой ситуации:

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_attribute pa2 ON p.property_id = pa2.property_id
INNER JOIN property_attribute pa3 ON p.property_id = pa3.property_id
WHERE pa.attribute_value_id = 2 
AND pa2.attribute_value_id = 5
AND pa3.attribute_value_id = 7

Это делает использование самосоединения.


person Brandon Minton    schedule 31.07.2012    source источник
comment
возможный дубликат Mysql select с условной логикой   -  person MvG    schedule 01.08.2012
comment
@MvG, возможно, в титульном смысле, но что касается содержания моего вопроса, я не вижу его сходства с содержанием предложенных вами возможных дубликатов.   -  person Brandon Minton    schedule 01.08.2012
comment
это несколько атрибутов выбора, с какими типами вещей связаны эти атрибуты/значения? продукты? Что вы в конечном итоге пытаетесь найти? конкретная ванная комната с определенной стоимостью, которая также имеет 3-5 спален и 2,5 ванны? Я понимаю проблему, с которой вы столкнулись, но трудно визуализировать решение, когда вы не даете подробностей о том, что вы пытаетесь отсортировать.   -  person Ryan    schedule 01.08.2012
comment
@RPM, ты понял, я пытаюсь найти идентификатор собственности, скажем, с 2 ванными комнатами и 2 спальнями.   -  person Brandon Minton    schedule 01.08.2012
comment
@Brandon На самом деле это сложная проблема. Хотя я точно знаю, что ты пытаешься сделать. Тоже очень интересная проблема. Вы видите это повсюду на сайтах интеллектуальных поисковых систем. Вы пытаетесь найти недвижимость и сопутствующие товары с определенной ценностью, верно? Итак, у вас есть набор домов, но все они имеют разные атрибуты. Вы хотите найти дома, в которых собственность (ванные) = 2 И собственность (спальни) = 2. Зачем использовать лайк? Это не будет абсолютной величиной.   -  person Ryan    schedule 01.08.2012
comment
@RPM, у тебя правильное представление о том, что я делаю. Посмотрите мое решение, оно использует самосоединение. Это не очень хорошо масштабируется, но есть и другие способы получения ответа, такие как использование подсчета с предложением GROUP BY и предложением HAVING на основе подсчета.   -  person Brandon Minton    schedule 02.08.2012
comment
@Brandon Да, группа и наличие count (*) (количество FACETS) или значений атрибутов, как бы вы это ни называли. Вы рассматривали подзапрос?   -  person Ryan    schedule 02.08.2012


Ответы (1)


У вас очень много косвенности в вашей схеме. Есть ли какая-то конкретная причина, по которой вам нужна таблица property_attribute? Ожидаете ли вы, что одно значение атрибута будет общим для многих свойств?

В любом случае, вот вам запрос. Очень в духе двух возможно дубликаты, о которых я упоминал выше.

SELECT property.property_id,
       bedrooms.value AS bedrooms,
       bathrooms.value AS bathrooms
FROM property,
     attribute AS bedrooms_attr,
     attribute_value AS bedrooms,
     property_attribute AS bedrooms_prop,
     attribute AS bathrooms_attr,
     attribute_value AS bathrooms,
     property_attribute AS bathrooms_prop
WHERE bedrooms_attr.name = 'bedrooms'
  AND bedrooms.attribute_id = bedrooms_attr.attribute_id
  AND bedrooms.attribute_value_id = bedrooms_prop.attribute_value_id
  AND bedrooms_prop.property_id = property.property_id
  AND bedrooms.value = 2
  AND bathrooms_attr.name = 'bathrooms'
  AND bathrooms.attribute_id = bathrooms_attr.attribute_id
  AND bathrooms.attribute_value_id = bathrooms_prop.attribute_value_id
  AND bathrooms_prop.property_id = property.property_id
  AND bathrooms.value = 2

Спасибо, что предоставили скрипт с данными для поиграться.

person MvG    schedule 01.08.2012
comment
Да, атрибуты будут общими для многих свойств. Пользователь может создавать любые атрибуты по своему желанию. Насчет дубликатов, может и ладно по духу, но в итоге они мне совсем не помогли. Однако я нашел несколько интересных идей на этом сайте, которые предоставили идеи для достаточного решения. Выложу выше. И да, я понятия не имел о существовании скрипта sql, но благодаря вам он стал стандартным инструментом. - person Brandon Minton; 02.08.2012
comment
@BrandonMinton, кажется, вы говорите об атрибутах, общих для многих свойств, то есть о строках из таблицы attribute. Это разделение имеет смысл. Я имел в виду совместное использование значений атрибутов, то есть строк из таблицы attribute_value. Такое совместное использование я считаю довольно экзотическим, так что вы могли бы также избавиться от property_attribute и вместо этого включить property_id в таблицу attribute_value. Вы можете отказаться от attribute_value.id и сделать (property_id,attribute_id) комбинированным первичным ключом для attribute_value. - person MvG; 02.08.2012
comment
это отличное предложение. Срок для этого нормализует правильно? - person Brandon Minton; 02.08.2012