Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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变量,组_CONCAT不工作_Mysql - Fatal编程技术网

MySQL变量,组_CONCAT不工作

MySQL变量,组_CONCAT不工作,mysql,Mysql,我有一个问题,变量不等于输出。一只宠物有一个主人,这将尝试查看该主人是否有其他宠物,并将它们分组 SELECT o.id, o.last_name, @dog_names := GROUP_CONCAT(concat(p2.name,' (',REPLACE(REPLACE(p.type,'Big Dog','BD'),'Small Dog','LD'),')') SEPARATOR ', ') as dog_names, @dog_names as dog_variable, concat(o

我有一个问题,变量不等于输出。一只宠物有一个主人,这将尝试查看该主人是否有其他宠物,并将它们分组

SELECT
o.id,
o.last_name,
@dog_names := GROUP_CONCAT(concat(p2.name,' (',REPLACE(REPLACE(p.type,'Big Dog','BD'),'Small Dog','LD'),')') SEPARATOR ', ') as dog_names,
@dog_names as dog_variable,
concat(o.last_name,' - ',@dog_names) as label
FROM pets p
LEFT JOIN owners o ON p.owner_id = o.id
LEFT JOIN pets p2 ON p.owner_id = p2.owner_id
WHERE p.name = 'wolfie'
GROUP BY o.id
结果如下:

id   | last_name | dog_names               | dog_variable | label
1647 | Reeve     | Wolfie (BD), Ember (BD) | Wolfie (BD)  | Reeve - Wolfie (BD)

为什么dog_变量与dog_名称不匹配?

它们是在同一级别计算的,没有特定的顺序。SQL就是这样工作的:它是声明性的,而不是过程性的,在任何查询中都不能在同一级别上假定求值顺序

换句话说,
@dog\u names作为dog\u变量
将使用较旧的值
@dog\u names
,因为没有为此迭代重新计算if

如果希望它是正常的,则重复该表达式或使用嵌套查询

SELECT
   id, last_name,
   @dog_names := dog_names,
   @dog_names as dog_variable,
   concat(last_name,' - ', @dog_names) as label
FROM
    (
    SELECT
      o.id,
      o.last_name,
      GROUP_CONCAT(concat(p2.name,' (',REPLACE(REPLACE(p.type,'Big Dog','BD'),'Small Dog','LD'),')') SEPARATOR ', ') as dog_names
    FROM pets p
    LEFT JOIN owners o ON p.owner_id = o.id
    LEFT JOIN pets p2 ON p.owner_id = p2.owner_id
    WHERE p.name = 'wolfie'
    GROUP BY o.id, o.last_name
    ) x

既然如此,为什么要在GROUP_CONCAT中使用变量呢?

只是在寻找其他方法来做事情。。这个嵌套查询非常有效。如何在不嵌套的情况下实现相同的结果?@Soth:不要使用变量,也就是说,重复GROUP_CONCAT表达式
SELECT 
    o.id, 
    o.last_name, 
    @dog_names := GROUP_CONCAT(concat(p2.name,' (',REPLACE(REPLACE(p.type,'Big Dog','BD'),'Small Dog','LD'),')') SEPARATOR ', '),
    @dog_names as dog_names, 
    @dog_names as dog_variable, 
    concat(o.last_name,' - ',@dog_names) as label
FROM pets p
LEFT JOIN owners o ON p.owner_id = o.id
LEFT JOIN pets p2 ON p.owner_id = p2.owner_id
WHERE p.name = 'wolfie'
GROUP BY o.id