具有多个联接的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
组合。