具有多个联接的MySQL查询,根据联接类型选择
我不确定如何编写满足以下条件的查询:具有多个联接的MySQL查询,根据联接类型选择,mysql,Mysql,我不确定如何编写满足以下条件的查询: SELECT gems.*, metals.* FROM `locations` JOIN gems ON locations.locatable_id = gems.id AND locations.locatable_type = 'Gem' JOIN metals ON locations.locatable_id = metals.id AND locations.locatable_type = 'Metal'
SELECT
gems.*, metals.*
FROM
`locations`
JOIN
gems ON locations.locatable_id = gems.id AND locations.locatable_type = 'Gem'
JOIN
metals ON locations.locatable_id = metals.id AND locations.locatable_type = 'Metal'
WHERE
locations.latitude BETWEEN 0.0000 AND 1.0000 AND locations.longitude BETWEEN -1.0000 AND -2.0000
其中,如果Where语句中关联的位置结果为可定位类型Gem
,则结果将选择一些Gem
,如果位置
类型为金属
,则选择金属
有可能出现这样的混合结果吗?您需要将位置与表连接为位置的两倍。可定位类型不能同时为“Gem”和“Metal”,例如:
SELECT
gems.*, metals.*
FROM
`locations` l1
JOIN
gems ON l1.locatable_id = gems.id AND l1.locatable_type = 'Gem'
JOIN
users ON locations.locatable_id = metals.id AND locations.locatable_type = 'Metal'
WHERE
l1.latitude BETWEEN 0.0000 AND 1.0000 AND l1.longitude BETWEEN -1.0000 AND -2.0000
UNION
SELECT
gems.*, metals.*
FROM
`locations` l=2
JOIN
users ON l2.locatable_id = metals.id AND l2.locatable_type = 'Metal'
WHERE
l2.latitude BETWEEN 0.0000 AND 1.0000 AND l2.longitude BETWEEN -1.0000 AND -2.0000
您只需要稍微重新构造一下查询。以下几点应该有用
SELECT
G.*, M.*
FROM
locations L
JOIN
gems G ON L.locatable_id = G.id
JOIN
metals M ON L.locatable_id = M.id
WHERE
L.latitude BETWEEN 0.0000 AND 1.0000
AND L.longitude BETWEEN - 1.0000 AND - 2.0000
AND (L.locatable_type = 'Gem' OR L.locatable_type = 'Metal');
添加有助于理解您的问题的示例数据和所需结果您应该执行两个单独的联接查询,并将它们与UNION
组合。