Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Mysql 在带有LIKE的CASE语句中使用GROUP_CONCAT列别名_Mysql_View_Case_Group Concat - Fatal编程技术网

Mysql 在带有LIKE的CASE语句中使用GROUP_CONCAT列别名

Mysql 在带有LIKE的CASE语句中使用GROUP_CONCAT列别名,mysql,view,case,group-concat,Mysql,View,Case,Group Concat,这里的想法是,GROUP_CONCAT从与option_stock和options table关联的stock表中编译一个期权代码列表,并按股票id分组。 下面是一个示例行: Name Options Transmission 'Holden Commodore' '111, 145, 166, 188' 'Auto' 这个视图是这样工作的,但我忍不住觉得有一个更优雅的解决方案 CREATE VIEW stock_view AS

这里的想法是,GROUP_CONCAT从与option_stock和options table关联的stock表中编译一个期权代码列表,并按股票id分组。 下面是一个示例行:

Name                Options             Transmission
'Holden Commodore' '111, 145, 166, 188' 'Auto' 
这个视图是这样工作的,但我忍不住觉得有一个更优雅的解决方案

CREATE VIEW stock_view AS
    (select s.description AS Name,
    group_concat(o.option_code order by o.option_code ASC separator ', ') 
    AS Options, 
    (case
        WHEN group_concat(o.option_code) LIKE '%111%' then 'Auto'
        WHEN group_concat(o.option_code) LIKE '%112%' then 'Manual'
        else 'Other'
    end) as Transmission
    from stock s
    join option_stock ost ON s.id = ost.stock_id
    join options o ON o.id = ost.option_id
    group by s.id)
我试图避免在CASE语句中使用这个难看的GROUP_CONCAT,但我得到一个错误,即如果我在CASE语句中使用它,则字段
Options
不存在:

WHEN `Options` LIKE '%111%' then 'Auto'
CREATE VIEW stock_view AS
(SELECT
    gc.Name,
    gc.Options,
    (case
        WHEN gc.Options LIKE '%111%' then 'Auto'
        WHEN gc.Options LIKE '%112%' then 'Manual'
        else 'Other'
    end) as Transmission
FROM
    (select 
        s.description AS Name,
        group_concat(o.option_code order by o.option_code ASC separator ', ') AS Options
    from 
        stock s
        join option_stock ost ON s.id = ost.stock_id
        join options o ON o.id = ost.option_id
    group by 
        s.id) gc);

我知道抛出错误的原因——这是因为不能以这种方式使用另一列的别名。但是有办法解决吗?

如果没有实际的表,很难进行测试(实际上无法执行该语句),但是像这样的事情呢:

WHEN `Options` LIKE '%111%' then 'Auto'
CREATE VIEW stock_view AS
(SELECT
    gc.Name,
    gc.Options,
    (case
        WHEN gc.Options LIKE '%111%' then 'Auto'
        WHEN gc.Options LIKE '%112%' then 'Manual'
        else 'Other'
    end) as Transmission
FROM
    (select 
        s.description AS Name,
        group_concat(o.option_code order by o.option_code ASC separator ', ') AS Options
    from 
        stock s
        join option_stock ost ON s.id = ost.stock_id
        join options o ON o.id = ost.option_id
    group by 
        s.id) gc);

进行单独连接以确定变速箱类型:

CREATE VIEW stock_view AS
select
    s.description AS Name,
    group_concat(o.option_code order by o.option_code separator ', ') AS Options,
    if(t.option_code = '111', 'Auto', 'Manual') as Transmission
from stock s
join option_stock ost ON s.id = ost.stock_id
join options o ON o.id = ost.option_id
left join options t on t.id = ost.option_id 
     and option_code in ('111', '112')
group by s.id
只有一行将从变速箱联接中联接(汽车不能同时是自动和手动的),这种方法避免了所有这些子查询


将连接设置为左连接意味着缺少的变速器选项将显示为手动。您可以通过添加一个null测试来调整它,使其具有默认值。

您必须创建两个独立的视图,因为MySQL不支持视图中的子查询

试试这个:

CREATE VIEW stock_view AS
  SELECT s.description AS sname, 
         GROUP_CONCAT(o.option_code ORDER BY o.option_code SEPARATOR ', ')  AS soptions 
  FROM stock s
  INNER JOIN option_stock ost ON s.id = ost.stock_id
  INNER JOIN OPTIONS o ON o.id = ost.option_id
  GROUP BY s.id;

CREATE VIEW stock_view1 AS 
  SELECT sname, soptions, 
         (CASE WHEN FIND_IN_SET('111', soptions) THEN 'Auto'
               WHEN FIND_IN_SET('112', soptions) THEN 'Manual'
               ELSE 'Other'
         END) AS Transmission
  FROM stock_view;

我觉得这些数据不够可靠:

WHEN group_concat(o.option_code) LIKE '%111%' ...
WHEN group_concat(o.option_code) LIKE '%112%' ...
如“%111%”
将匹配,例如
'111222、145、166、188'
以及
'111、145、166、188'
。当然,除非只有3个字符的代码,而且你不希望很快改变

不过,无论如何,我可能会使用不同的技术,最有可能的是条件计数或求和。例如:

(CASE
    WHEN SUM(o.option_code = '111') > 0 THEN 'Auto'
    WHEN SUM(o.option_code = '112') > 0 THEN 'Manual'
    ELSE 'Other'
END) AS Transmission
还要注意的是,在您的特定情况下,以下解决方案虽然相当具体,但也应该起作用:

IFNULL(
    MIN(CASE o.option_code WHEN '111' THEN 'Auto' WHEN '112' THEN 'Manual' END),
   'Other'
) AS Transmission

也就是说,如果
'111'
或者由于某种原因,在同一组行中的代码中同时发现
'111'
'112'
,则
MIN()
将返回
'Auto'
,如果
'112'
不是
'111'
,它将计算为
'Manual'
。否则它将为NULL,在这种情况下,
IFNULL()
函数将计算为
“Other”

这是否有效?我不认为选择可以进入视图中?我用你的答案作为灵感,创建了第二个视图选择s.id,group_concat(o.option_代码顺序按o.option_代码ASC分隔符','))作为
stock
s
上的
option\u stock
ost
id
ost
stock\u id
加入
Options
o
id
ost
option\u id
按s.id分组,并将其添加到我的股票视图中因此,我可以使用when选项\u view.options(如“%111”和“Auto”)抱歉,关于格式设置,我不知道如何添加新行。关于FROM中的子查询,您是对的-抱歉,已经有一段时间了。