Как самостоятельно объединить несколько значений в MySQL? - PullRequest
0 голосов
/ 05 марта 2011

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

Я просто не могу найти хороший пример рабочего запроса.

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

Выберите все сообщения с указанием города = Даллас, стиль = ранчо, цена от 100 000 до 200 000, пул = true

Iможет иметь больше или меньше мета-значений, с которыми мне нужно сравнить.

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

1 Ответ

3 голосов
/ 05 марта 2011

Ах, радости EAV. Короче говоря, вам нужно сделать несколько подзапросов или кросс-таблицу.

Select ...
From Posts
Where post_id In    (
                    Select post_id
                    From Meta
                    Where Attribute = 'City'
                        And Value = 'Dallas'
                    )
    And post_id In  (
                    Select post_id
                    From Meta
                    Where Attribute = 'Style'
                        And Value = 'Ranch'
                    )
    And post_id In  (
                    Select post_id
                    From Meta
                    Where Attribute = 'Price'
                        And Cast(Value As int) Between 100000 And 200000
                    )
    And post_id In  (
                    Select post_id
                    From Meta
                    Where Attribute = 'Pool'
                        And Value = 'True'
                    )   

Вот еще одна форма, которая создает кросс-таблицу. Он более компактен, но может не работать так же:

Select ...
From Posts As P
    Join    (
            Select post_id
                , Min( Case When Attribute = 'City' Then Value End ) As City
                , Min( Case When Attribute = 'Style' Then Value End ) As Style
                , Min( Case When Attribute = 'Price' Then Cast(Value As int) End ) As Price
                , Min( Case When Attribute = 'Pool' Then Value End ) As Pool
            From Meta
            Where Attribute In('City','Style','Price','Pool')
            Group By post_id
            ) As Attributes
        On Attributes.post_id = P.post_id
Where Attributes.City = 'Dallas'
    And Attributes.Style = 'Ranch'
    And Attributes.Price Between 100000 And 200000
    And Attributes.Pool = 'True'
...