Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 SQL-左连接多个条件-优先级_Mysql_Sql_Left Join - Fatal编程技术网

Mysql SQL-左连接多个条件-优先级

Mysql SQL-左连接多个条件-优先级,mysql,sql,left-join,Mysql,Sql,Left Join,我有两张结构类似的表: 表:用户 字段:id、活动\u办公室\u地址\u id(可以是0) 表:用户地址 字段:id、用户id、类型(家庭、办公室) 用户可以有一个“家庭”地址(非强制性)和多个“办公室”地址。我有一个连接来获取用户地址,但是如果用户有一个“家庭”地址来获取该地址,而不是“办公室”地址,那么我需要这个连接 所以,如果存在“家庭”地址,我如何获取该地址,并且只有当该地址不存在时,我才能获取“办公室”地址。(实际上,查询要复杂得多,连接是在4-5个表上完成的) 至少在SQL Serv

我有两张结构类似的表:

表:用户

字段:id、活动\u办公室\u地址\u id(可以是0)

表:用户地址

字段:id、用户id、类型(家庭、办公室)

用户可以有一个“家庭”地址(非强制性)和多个“办公室”地址。我有一个连接来获取用户地址,但是如果用户有一个“家庭”地址来获取该地址,而不是“办公室”地址,那么我需要这个连接

所以,如果存在“家庭”地址,我如何获取该地址,并且只有当该地址不存在时,我才能获取“办公室”地址。(实际上,查询要复杂得多,连接是在4-5个表上完成的)


至少在SQL Server中,不确定MySql,您可以在order by子句中使用
case
语句,例如:

order by user.id, case user_address.type when 'home' then 1 else 2 end, --additional ordering clauses here

两个左连接和一个case语句将为您提供所需的地址id

SELECT user.*,CASE WHEN home_addr.id IS NOT NULL THEN home_addr.id ELSE ofc_addr.id END AS addr_id
FROM user
LEFT JOIN user_address AS home_addr
  ON (user.id = home_addr.user_id AND home_addr.type = 'home')
LEFT JOIN user_address AS ofc_addr
  ON (user.active_office_address_id = ofc_addr.id)
您可以将其作为特定用户的子选择反馈:

SELECT * FROM user LEFT JOIN user_address
WHERE user.id = ?
AND user_address.user_id = user.id
AND user_address.id IN
    (SELECT CASE WHEN home_addr.id IS NOT NULL THEN home_addr.id ELSE ofc_addr.id END AS addr_id
    FROM user
    LEFT JOIN user_address AS home_addr
      ON (user.id = home_addr.user_id AND home_addr.type = 'home')
    LEFT JOIN user_address AS ofc_addr
      ON (user.active_office_address_id = ofc_addr.id)
    WHERE user.id = ?)
这假设每个用户只存在一个家庭地址。

您可以使用
COALESCE()
并两次加入地址表:

  SELECT user.id
       ,COALESCE(home.address, office.address) AS Address
  FROM user 
  LEFT JOIN user_address AS home
     ON user.id = home.user_id 
       AND home.type = "home"
  LEFT JOIN user_address AS office
     ON user.active_office_address_id = office.user_id 
  GROUP BY user.id

假设mysql支持,合并函数将帮助您。@morandi3。您想要所有的办公室地址还是只有一个?可能需要是office.id?不完全清楚,但重要的一点是
COALESCE()
和连接两次,因为地址数据可能是标准化的。home.address和office.address是什么?id?它们将是您试图返回的实际地址字段。是的,每个用户只存在一个家庭地址。
  SELECT user.id
       ,COALESCE(home.address, office.address) AS Address
  FROM user 
  LEFT JOIN user_address AS home
     ON user.id = home.user_id 
       AND home.type = "home"
  LEFT JOIN user_address AS office
     ON user.active_office_address_id = office.user_id 
  GROUP BY user.id