简体   繁体   English

Sql左侧使用filter连接两列

[英]Sql left join across two columns with filter

UPDATE: This is resolved, I was making a syntax error. 更新:这已解决,我正在进行语法错误。


Can I join and filter across two columns in a left join? 我可以加入并过滤左连接中的两列吗? For example: 例如:

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

Then using SQL: 然后使用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

Can I add a flag so that I can determine whether or not the food pair is in joined or if it's NULL? 我可以添加一个标志,以便我可以确定食物对是否已连接或是否为空? I don't want to inner join, because I need to count total food/sides per person, and also matching food/side pairs per person. 我不想内心加入,因为我需要计算每人的食物/食物总量,以及每人的食物/配对数量。 I tried: 我试过了:

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

But it's not working. 但它不起作用。 Basically I just need to flag when the join isn't applied but I'm having trouble. 基本上我只需要标记何时不应用连接但我遇到了麻烦。

I think what you want is this: 我想你想要的是这个:

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

With MySQL an expression will return a boolean true/false 1/0, works as a shorthand CASE statement when looking for boolean output. 对于MySQL,表达式将返回布尔值true / false 1/0,在查找布尔输出时用作简写CASE语句。

This will work to flag the non-matching with 1: 这将标记与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

Demo: SQL Fiddle 演示: SQL小提琴

Or this to flag the non-matching as 0: 或者这将非匹配标记为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

Demo: SQL Fiddle 演示: SQL小提琴

Try to flag null value before join 尝试在join之前标记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

It returns 1 when the expression is NULL otherwise it returns 0. 当表达式为NULL时返回1,否则返回0。

http://sqlfiddle.com/#!2/cadbdd/15/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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM