如何将 MySQL 子查询中的所有不同值选择到 group_concat 中?

Posted

技术标签:

【中文标题】如何将 MySQL 子查询中的所有不同值选择到 group_concat 中?【英文标题】:How to select all distinct values in a MySQL subquery into a group_concat? 【发布时间】:2012-08-23 22:17:49 【问题描述】:

我正在运行 mysql 5.0.88 并进行搜索,我正在运行 presearch 以确定 number of recordsmin-max valueselement strings of distinct values

查询结果如下所示:

  records      min-price    max-price   sizeRange   colorRange
  1234         9.00         124.00      S,M,L,XL    red,blue,white,orange

我的查询如下所示:

SELECT    COUNT(recordcount) AS total_records
        , MIN(min_price_ek) AS ek_min
        , MAX(max_price_ek) AS ek_max
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT sizeRange ), ',', 10  ) AS sz_rng
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT colorRange ), ',', 16  ) AS cl_rng 

        FROM (SELECT  a.id AS recordcount
                    , a.nos
                    , a.nos_anzeige
                    , MAX(<cfif variables.preislisten neq "">IFNULL(p.ek, a.preis_ek)<cfelse>a.preis_ek</cfif>) AS max_price_ek
                    , MIN(<cfif variables.preislisten neq "">IFNULL(p.ek, a.preis_ek)<cfelse>a.preis_ek</cfif>) AS min_price_ek
                    , a.groesse AS sizeRange
                    , zu.systemfarbe AS colorRange

              FROM artikelstammdaten a

              LEFT JOIN farbenzuordnung zu 
                ON a.farbe = zu.farbe 

              WHERE a.aktiv = "ja"
          AND a.artikelnummer LIKE <cfqueryparam value="#art#" cfsqltype="cf_sql_varchar">

              GROUP BY a.iln, a.artikelnummer, a.preis_aktuell, a.artikelbezeichnung
              HAVING (( sum(a.bestand) != 0 ) OR (a.nos = "ja" AND a.nos_anzeige = "ja" ))

        ) AS temp

这没问题,但我仍然无法选择所有可用的尺寸/颜色。我得到了一些值,但不是全部。

我的桌子是这样的:

  CREATE TABLE dummy (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `iln` VARCHAR(13) NULL DEFAULT NULL,
 `ean` VARCHAR(35) NULL DEFAULT NULL,
 `artikelnummer` VARCHAR(35) NULL DEFAULT NULL,
 `preis_ek` DECIMAL(12,2) NULL DEFAULT NULL,
 `preis_vk` DECIMAL(12,2) NULL DEFAULT NULL,
 `firma` VARCHAR(35) NULL DEFAULT NULL,
 `nos` VARCHAR(4) NULL DEFAULT NULL,
 `nos_anzeige` VARCHAR(4) NULL DEFAULT NULL,
 `aktiv` VARCHAR(4) NULL DEFAULT NULL,
 `bestand` DECIMAL(10,0) NULL DEFAULT '0'
  )  

因此,产品将存储在表中,每个尺寸都有一个条目,如下所示:

 product_id      ean           size     price
 1234          111111111111    S        9.99
 1234          111111111112    M        9.99
 1234          111111111113...

从我在 MySQL 中得到的结果来看,我认为我只选择了文章的第一个大小 (S),并创建了一个 GROUP_CONCAT of all DISTINCT first sizes 与一个 GROUP_CONCAT 的所有 DISTINCT 大小的记录集`。

问题: 有人可以告诉我如何调整我的GROUP_CONCAT 吗?

谢谢!

这是我目前正在测试的查询

SELECT    COUNT(recordcount) AS total_records
        , MIN(min_price_ek) AS ek_min
        , MAX(max_price_ek) AS ek_max
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT sizeRange ), ',', 10  ) AS sz_rng
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT colorRange ), ',', 16  ) AS cl_rng 

        FROM (SELECT  a.id AS recordcount
                    , a.nos
                    , a.nos_anzeige
                    , MAX(a.preis_ek) AS max_price_ek
                    , MIN(a.preis_ek) AS min_price_ek
                    , a.groesse AS sizeRange
                    , zu.systemfarbe AS colorRange

                FROM artikelstammdaten a

                LEFT JOIN farbenzuordnung zu 
                    ON a.farbe = zu.farbe 
                WHERE a.aktiv = "ja"
                AND a.artikelnummer LIKE "%402%"

                GROUP BY a.iln, a.artikelnummer
                HAVING (( sum(a.bestand) != 0 ) OR (a.nos = "ja" AND a.nos_anzeige = "ja" ))

        ) AS temp

我已经删除了第三张表(货币查找/左连接),因为无论有没有它,结果都是错误的。这是剩下的两个表:

   ** artikelstammdaten = product data **
   CREATE TABLE dummy (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `iln` VARCHAR(13) NULL DEFAULT NULL,
    `ean` VARCHAR(35) NULL DEFAULT NULL,
    `artikelnummer` VARCHAR(35) NULL DEFAULT NULL,
    `groesse` VARCHAR(10) NULL DEFAULT NULL,
    `farbe` VARCHAR(35) NULL DEFAULT NULL,
    `preis_ek` DECIMAL(12,2) NULL DEFAULT NULL,
    `preis_vk` DECIMAL(12,2) NULL DEFAULT NULL,
    `preis_aktuell` DECIMAL(12,2) NULL DEFAULT NULL,
    `marke` VARCHAR(35) NULL DEFAULT NULL,
    `nos` VARCHAR(4) NULL DEFAULT NULL,
    `nos_anzeige` VARCHAR(4) NULL DEFAULT NULL,
    `aktiv` VARCHAR(4) NULL DEFAULT NULL,
    `modus` VARCHAR(4) NULL DEFAULT NULL,
    `bestand` DECIMAL(10,0) NULL DEFAULT '0'
 )

   ** global colors / farbenzuordnung **
   CREATE TABLE dummy (
    `ILN` VARCHAR(13) NOT NULL,
    `farbe` VARCHAR(35) NOT NULL,
    `systemfarbe` VARCHAR(35) NOT NULL,
    `systemfarbe_en` VARCHAR(35) NOT NULL
   )

我现在正在测试一个产品 (402)。该产品有 4 种尺寸和两种颜色,因此数据库中有 8 条记录。在其上运行查询应该返回 s,m,l,xl 的大小和 red, black 的颜色作为 Group__concat。但是我只得到(仲裁?)sred 作为结果。

仍然不知道为什么。

【问题讨论】:

您是否尝试过删除 substring_index 函数,即简单地使用 group_concat 函数? 嗯。那么有没有另一种方法来限制放入 GROUP_CONCAT 的内容?如果可能的话,我只会包含前 20 个出现的尺寸/颜色,而不是将 GROUP_CONCAT 限制为 10/16 结果 您根据什么标准定义 TOP 20? 对不起。大多数出现。例如,XL 码在结果集中出现的频率是多少 子查询中的 a.nos_anzeige 和 a.nos 是什么? 【参考方案1】:

您可以使用GROUP_CONCAT along with ORDER BY CLAUSE进行如下查询,

注意:您需要根据您的要求定义以下查询中的条件

SELECT    COUNT(recordcount) AS total_records
        , MIN(min_price_ek) AS ek_min
        , MAX(max_price_ek) AS ek_max
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT sizeRange ORDER BY [criteria]), ',', 20  ) AS sz_rng
        , SUBSTRING_INDEX( GROUP_CONCAT( DISTINCT colorRange ORDER BY [criteria]), ',', 20  ) AS cl_rng 

        FROM (SELECT  a.id AS recordcount
                    , a.nos
                    , a.nos_anzeige
                    , MAX(<cfif variables.preislisten neq "">IFNULL(p.ek, a.preis_ek)<cfelse>a.preis_ek</cfif>) AS max_price_ek
                    , MIN(<cfif variables.preislisten neq "">IFNULL(p.ek, a.preis_ek)<cfelse>a.preis_ek</cfif>) AS min_price_ek
                    , a.groesse AS sizeRange
                    , zu.systemfarbe AS colorRange

              FROM artikelstammdaten a

              LEFT JOIN farbenzuordnung zu 
                ON a.farbe = zu.farbe 

              WHERE a.aktiv = "ja"
          AND a.artikelnummer LIKE <cfqueryparam value="#art#" cfsqltype="cf_sql_varchar">

              GROUP BY a.iln, a.artikelnummer, a.preis_aktuell, a.artikelbezeichnung
              HAVING (( sum(a.bestand) != 0 ) OR (a.nos = "ja" AND a.nos_anzeige = "ja" ))

        ) AS temp

希望对你有帮助...

【讨论】:

酷。试试这个。到目前为止谢谢! 嗯。 MySQL 抱怨 invalid use of GROUP function 你用什么代替标准? 现在我有COUNT(sizeRange) 提供所涉及的列和表的一些描述,以便我们可以调查...

以上是关于如何将 MySQL 子查询中的所有不同值选择到 group_concat 中?的主要内容,如果未能解决你的问题,请参考以下文章

那个mysql 子查询和连接查询 一般常用哪个 谁效率高些

如何将 SELECT ALL 值或 SELECTED 复选框值插入 mysql 中的不同列?

我将如何同时插入具有所有不同子查询值的同一行,几乎就像通过子查询进行迭代一样?

mysql中的子查询将一列用于两个不同的结果

将mysql中的列从上到下行求和并选择值所在的行

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?