2010-09-15 43 views
1

我正在選擇屬性並將它們連接到映射表,並將它們映射到過濾器(如位置,目標和屬性類型)。我正確使用GROUP_CONCAT嗎?

我的目標是抓住所有的屬性,然後將它們加入到表中,然後基本上獲取顯示所有位置,屬性所屬目標和屬性類型本身的數據。

這裏是我的查詢:

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 BYGROUP_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 BYGROUP_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 

這是gra的首選方式一口氣將所有可能的財產映射到GROUP_CONCAT變成這樣的CSV?

使用這些數據,我可以呈現類似...

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

然後使用JavaScript顯示,如果基於/隱藏在具有說,一個subcategory="2"屬性會隱藏每一個錨用戶點擊.property它的subcategories屬性值中沒有2

回答

2

我相信你想是這樣的:

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哪一類的ID映射到子類別的ID的數組。

1

您應該添加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 

這是「去標準化」如果你想這樣稱呼它。如果這是用於渲染的最佳表示是另一個問題,我認爲它很好。有人可能會說這是黑客攻擊,但我猜這不算太壞。

順便說一句,逗號似乎在「類型」後缺少。