Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我是否正确使用GROUP_CONCAT?_Sql_Mysql_Group Concat - Fatal编程技术网

Sql 我是否正确使用GROUP_CONCAT?

Sql 我是否正确使用GROUP_CONCAT?,sql,mysql,group-concat,Sql,Mysql,Group Concat,我正在选择属性并将它们连接到映射表,在映射表中它们被映射到过滤器,例如位置、目标和属性类型 我的目标是获取所有属性,然后将它们左键连接到表中,然后基本上获取显示属性所附加到的所有位置、目的地以及属性类型本身的数据 我的问题是: SELECT p.slug AS property_slug, p.name AS property

我正在选择属性并将它们连接到映射表,在映射表中它们被映射到过滤器,例如位置、目标和属性类型

我的目标是获取所有属性,然后将它们左键连接到表中,然后基本上获取显示属性所附加到的所有位置、目的地以及属性类型本身的数据

我的问题是:

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 
在执行
分组方式
分组方式
之前,我的数据如下所示:

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
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;
经过
分组
分组_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
这是将所有可能的属性映射一次性抓取到CSV中的首选方法吗

使用这些数据,我可以渲染如下内容

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

{property_name}
{property_location}

然后使用Javascript显示/隐藏基于用户是否单击锚定,该锚定具有一个
subcategory=“2”
属性,它将隐藏每个
.property
,该属性在其
子类别
属性值内没有
2

您应该添加不同的属性,并且可能按以下顺序添加:

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”后面似乎少了一个逗号。

我相信你想要这样的东西:

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
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的数组