Я правильно использую GROUP_CONCAT? - PullRequest
1 голос
/ 15 сентября 2010

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

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

Вот мой запрос:

SELECT p.slug                                        AS property_slug, 
       p.name                                        AS property_name, 
       p.founder                                     AS founder, 
       IF (p.display_city != '', display_city, city) AS city, 
       d.name                                        AS state,
       type
       GROUP_CONCAT( CONVERT(subcategories_id, CHAR(8)) )  AS foo,
       GROUP_CONCAT( CONVERT(categories_id, CHAR(8)) ) AS bah
     FROM properties AS p 
LEFT JOIN destinations AS d ON d.id = p.state 
LEFT JOIN regions AS r ON d.region_id = r.id 
LEFT JOIN properties_subcategories AS sc ON p.id = sc.properties_id 
LEFT JOIN categories_subcategories AS c  ON c.subcategory_id = sc.subcategories_id 
    WHERE 1 = 1 
      AND p.is_active = 1       
GROUP  BY p.id 

Прежде чем я сделаю GROUP BY и GROUP_CONCAT мои данные выглядят так:

id  name                  type     category_id    subcategory_id    state
--------------------------------------------------------------------------
1   The Hilton Hotel      1        1              2                 7
1   The Hilton Hotel      1        1              3                 7
1   The BlaBla Resort     2        2              5                 7

После GROUP BY и GROUP_CONCAT оно становится ...

id  name                  type     category_id    subcategory_id    state
--------------------------------------------------------------------------
1   The Hilton Hotel      1        1, 1           2, 3              7
1   The BlaBla Resort     2        1              3                 7

Является ли это предпочтительным способомзахватить все возможные сопоставления для свойства за один раз, с GROUP_CONCAT в CSV, как это?

Используя эти данные, я могу сделать что-то вроде ...

<div class="property" categories="1" subcategories="2,3">
   <h2>{property_name}</h2>
   <span>{property_location}</span>
</div>

Затемиспользуйте Javascript для показа / скрытия, основываясь на том, что если пользователь щелкнет на якоре с атрибутом subcategory="2", он будет скрывать каждый .property, который не имеет 2 внутри своего значения атрибута subcategories.

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010

Я полагаю, вы хотите что-то вроде этого:

CREATE TABLE property (id INT NOT NULL PRIMARY KEY, name TEXT);

INSERT
INTO    property
VALUES
        (1, 'Hilton'),
        (2, 'Astoria');

CREATE TABLE category (id INT NOT NULL PRIMARY KEY, property INT NOT NULL);

INSERT
INTO    category
VALUES
        (1, 1),
        (2, 1),
        (3, 2);

CREATE TABLE subcategory (id INT NOT NULL PRIMARY KEY, category INT NOT NULL);

INSERT
INTO    subcategory
VALUES
        (1, 1),
        (2, 1),
        (3, 2),
        (5, 3),
        (6, 3),
        (7, 3);


SELECT  id, name,
        CONCAT(
        '{',
        (
        SELECT  GROUP_CONCAT(
                '"', c.id, '": '
                '[',
                (
                SELECT  GROUP_CONCAT(sc.id ORDER BY sc.id SEPARATOR ', ' )
                FROM    subcategory sc
                WHERE   sc.category = c.id
                ),
                ']' ORDER BY c.id SEPARATOR ', ')
        FROM    category c
        WHERE   c.property = p.id
        ), '}')
FROM    property p;

, который вывел бы это:

1   Hilton     {"1": [1, 2], "2": [3]}
2   Astoria    {"3": [5, 6, 7]}

Последнее поле является правильно сформированным JSON, которое отображает идентификаторы категории на массивы идентификаторов подкатегории.

1 голос
/ 16 сентября 2010

Вы должны добавить DISTINCT и, возможно, ORDER BY:

GROUP_CONCAT(DISTINCT CONVERT(subcategories_id, CHAR(8)) 
  ORDER BY subcategories_id)  AS foo,
GROUP_CONCAT(DISTINCT CONVERT(categories_id, CHAR(8)) 
  ORDER BY categories_id) AS bah

Это "ненормализовано", если вы хотите назвать это так. Если это лучшее представление, которое будет использоваться для рендеринга, это другой вопрос, я думаю, это нормально. Некоторые могут сказать, что это взлом, но я думаю, это не так уж плохо.

Кстати, запятая, похоже, отсутствует после "type".

...