【问题标题】:mysql join / subquery on multiple columns多列上的mysql连接/子查询
【发布时间】:2015-08-15 21:32:23
【问题描述】:

我有两张桌子(slots 和 items)

Table 'slots'

user_id     armor     helmet     weapon                
=======================================            
1           1         5          2
3           NULL      7          2 

那我有

Table 'items'

id     name            type     bonus                
=====================================            
1      Plate Armor     armor    2
2      Katana          weapon   4 
...

我想要的是得到这样的数组。

$equipment = array(
    'armor' => 'Plate Armor',
    'helmet' => 'Plate Helmet',
    'weapon' => 'Katana'
);

如何通过一个查询来实现这一目标?我正在使用一个查询来获取插槽,然后遍历它们并查询分配的项目,但这似乎效率不高。

【问题讨论】:

  • slots 看起来需要标准化
  • 你有什么建议@Strawberry
  • 类似user_id, slot_type, slot_item,但具体配置取决于您。

标签: mysql join subquery


【解决方案1】:

您需要为每件设备提供一个join,而这必须是一个left join,因为您的用户可能在插槽上没有设备:

SELECT  A.name AS armor, H.name AS helmet, W.name AS weapon
FROM    slots AS S
        LEFT JOIN items AS A
            ON A.id = S.armor
        LEFT JOIN items AS H
            ON H.id = S.helmet
        LEFT JOIN items AS W
            ON W.id = S.weapon
WHERE   S.user_id = 1

这将返回user_id 1 的项目

另一种选择是只做一个LEFT JOIN 来获取所有设备,每件设备一行:

SELECT  user_id, AI.type, I.name
FROM   (SELECT distinct type from items) AS AI
        JOIN slots AS S
            ON 1 = 1
        LEFT JOIN items AS I
            ON  I.id IN (S.armor, S.helmet, S.weapon)
            AND I.type = AI.type
WHERE   S.user_id = 3

【讨论】:

  • 谢谢!顺便说一句,它是否比对插槽进行一次查询然后循环遍历它们并查询每个插槽更有效?如果我有 10 个不同的插槽,做 10 个连接好吗?
  • 需要拉取单个用户的信息吗?
  • 是的,我想加载他所有的设备。
  • @Matumizuro 它比循环效率高得多,但比适当规范化的模式效率低得多
  • 见上文,另一种选择。
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2010-11-06
  • 2021-02-10
  • 1970-01-01
相关资源
最近更新 更多