2012-08-29 51 views
1

我正在运行MySQL 5.0.88,并搜索了我运行的presearch以确定number of records,。 min-max values以及element strings of distinct values如何选择MySQL子查询中的所有不同值到group_concat中?

查询的结果会是这样的:

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而不是记录集的所有DISTINCT尺寸的GROUP_CONCAT

问题: 有人可以给我一个指针,我需要如何调整我的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 

我已删除了第三个表(货币查找/ leftjoin)测试查询,因为结果是有或没有它假。这是剩下的两个表:

** 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的颜色。然而,我只是得到(arbitraty?)sred作为结果。

仍然无能为力。

+1

有你尝试通过删除substring_index函数,即简单地使用group_concat函数? – Shubhansh

+0

hm。有没有另外一种方法来限制什么才能进入GROUP_CONCAT呢?如果可能的话,我只包含TOP 20发生的尺寸/颜色,而不是将GROUP_CONCAT限制为10/16的结果 – frequent

+0

您是以什么标准定义TOP 20? – Shubhansh

回答

3

您可以使用查询中使用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 

希望它可以帮助下面的查询来定义标准...

+0

很酷。尝试这一点。非常感谢! – frequent

+0

hm。 MySQL正在抱怨'无效使用GROUP函数' – frequent

+0

你在填写什么标准? – Shubhansh