0

更新: これは解決されました。構文エラーが発生していました。


左結合で 2 つの列を結合してフィルター処理できますか? 例えば:

tbl_people
id    food     side     value
a     pizza    fries    10
b     pizza    shake     2
c     burger   fries    3

tbl_sides
food     side
pizza    fries
burger   fries

次に SQL を使用します。

SELECT 
  id, food, side, value
FROM
  tbl_people AS people
LEFT JOIN
  tbl_sides AS sides ON sides.food = people.food
  AND sides.side = people.side

食べ物のペアが結合されているかどうか、または NULL かどうかを判断できるように、フラグを追加できますか? 1 人あたりの食品/サイドの合計数と、1 人あたりの一致する食品/サイド ペアを数える必要があるため、内部参加はしたくありません。私は試した:

SELECT 
  id, food, side, value,
  CASE WHEN
    side.side IS NOT NULL
    AND side.food IS NOT NULL
    THEN 1
    ELSE 0
  END AS match_flag
FROM
  tbl_people AS people
LEFT JOIN
  tbl_sides AS sides ON sides.food = people.food
  AND sides.side = people.side

しかし、それは機能していません。基本的に、結合が適用されていないときにフラグを立てる必要があるだけですが、問題があります。

4

4 に答える 4

1

あなたが望むのはこれだと思います:

SELECT 
  id, food, side, value,
  CASE WHEN
    side.side = people.side 
    THEN 1
    ELSE 0
  END AS match_flag
FROM
  tbl_people AS people
LEFT JOIN
  tbl_sides AS sides ON people.food = sides.food
于 2013-09-24T16:18:25.343 に答える
1

MySQL では、式はブール値の true/false 1/0 を返し、ブール値のCASE出力を探すときに省略ステートメントとして機能します。

これは、一致しないものに 1 でフラグを立てるために機能します。

SELECT 
  people.id, people.food, people.side, people.value
  ,sides.food IS NULL AS match_flag
FROM
  tbl_people AS people
LEFT JOIN tbl_sides AS sides 
  ON sides.food = people.food
  AND sides.side = people.side

デモ: SQL フィドル

または、一致しないものに 0 のフラグを付けるには、次のようにします。

SELECT 
  people.id, people.food, people.side, people.value
  ,COALESCE(sides.food = people.food,0) AS match_flag
FROM
  tbl_people AS people
LEFT JOIN tbl_sides AS sides 
  ON sides.food = people.food
  AND sides.side = people.side

デモ: SQL フィドル

于 2013-09-24T16:20:50.417 に答える
0

結合する前に null 値にフラグを立てるようにしてください

SELECT 
  people.id, people.food, people.side, people.value, nvl(sides.side, 'NOT JOINED')
FROM
  tbl_people AS people
LEFT JOIN
  (select food, nvl(side, 'SOME NULL') as side from tbl_sides) AS sides 
 ON sides.food = people.food
AND sides.side = people.side
于 2013-09-24T16:26:08.940 に答える
0

式が NULL の場合は 1 を返し、それ以外の場合は 0 を返します。

http://sqlfiddle.com/#!2/cadbdd/15/0

SELECT *, ISNULL(sides.food) AS match_flag
FROM
  tbl_people AS people
LEFT JOIN
  tbl_sides AS sides ON sides.food = people.food
  AND sides.side = people.side
于 2013-09-24T16:35:55.447 に答える