1

変数が出力と等しくないという問題があります。ペットには 1 人の飼い主がいて、その飼い主が他のペットを飼っているかどうかを確認し、それらをグループ化しようとします。

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_variable が dog_names と一致しないのはなぜですか?

4

2 に答える 2

2

これらは、順不同で同じレベルで計算されます。これが SQL のしくみです。SQL は手続き型ではなく宣言型であり、どのクエリでも同じレベルで評価順序を想定することはできません。

言い換えると、がこの反復で再評価されていない場合は@dog_names as dog_variableの古い値を使用します@dog_names

正気にしたい場合は、式を繰り返すか、ネストされたクエリを使用します

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 で変数を使用するのでしょうか?

于 2013-04-23T08:23:49.800 に答える
0
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
于 2013-04-23T08:34:56.693 に答える