php - 如何 JOIN 表以获得表 A 的全部内容和表 B 的大部分内容

标签 php mysql sql

我很确定我需要 LEFT JOIN 为此,但我有一个障碍。我需要根据表 A 中的列从表 B 中提取一列。

TABLE A = list
list_id
user_id
operator_id
operator_name
operator_level


TABLE B = operators
operators_id
type
image
skill1
skill2
skill3
1
2
3
...
10

这是我现在的 SQL 查询:

SELECT * FROM list l 
    LEFT JOIN operators o ON l.operator_id = o.operators_id 
WHERE l.user_id=1 
ORDER BY o.10 DESC

它返回我想要的所有表 A,并且还返回我不需要的所有表 B。 第 1-10 列包含 INT 值,这些列对应于表 A 中的operator_level。

所以我真正需要的是创建一个临时列,并将任何 INT 放入与operator_level对应的1-10列中,或者只返回该行的该列。但我不知道该怎么做。

以下是一些示例数据和预期结果:

list list_id, user_id, operator_id, operator_name, operator_level
    1,       1,         2,     Johnson, Bob,        1
    2,       1,         3,     Mouse, Mickey,       9
    3,       1,         2,     Duck, Donald,        5

operators operator_id, type,    image,     skill1,    skill2, skill3,  1,   2,   3,   4,   5,   6,   7,   8,   9,  10
     1,      pilot,   image.jpg, F16,       B32,                   , 50,  60,  70,  80,  90,  100, 110, 120, 130, 140
     2,      medic,   image.jpg, first aid, trauma, general surgery, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145
     3,      kitchen, image.jpg, knife,     soup,                  , 20,  22,  24,  26,  28,  30,  32,  34,  36,  38

Expected Results list_id, user_id, operator_id, operator_name, operator_level, type,    image,     skill1,    skill2, skill3,         op_rate
    1,       1,         2,     Johnson, Bob,        1,        pilot,   image.jpg, F16,       B32,                     50
    2,       1,         3,     Mouse, Mickey,       9,        medic,   image.jpg, first aid, trauma, general surgery, 140
    3,       1,         2,     Duck, Donald,        5,        kitchen, image.jpg, knife,     soup,                    28

抱歉,它在我的编辑器中排列得很好,但失去了对齐。当我粘贴时。

向sqlfiddle添加了示例数据,不知道如何在那里添加预期结果。

http://sqlfiddle.com/#!2/390d8/1

最佳答案

您已经掌握了外连接的基础知识,但您可以做的是限制您在查询中选择的字段,如下所示:

select
    l.list_id,
    l.user_id,
    l.operator_id,
    l.operator_name,
    l.operator_level,
    `1`+`2`+`3`+...+`10` as opLevel
FROM 
    list l 
        LEFT JOIN operators o 
            ON l.operator_id = o.operators_id 
WHERE 
    l.user_id=1 
ORDER BY 
    o.10 DESC

这是基于以下事实:对于正确的运算符,and or 似乎有 0 个值。

话虽如此,为什么要用十个字段来存储一位信息呢?您的表应该只有一个名为“OperatorLevel”的字段,并且其中包含值 - 除非我遗漏了某些内容。

或者,如果您有多个值并且想要最大的值,您也可以在查询中使用Greatest() 函数:

select
    l.list_id,
    l.user_id,
    l.operator_id,
    l.operator_name,
    l.operator_level,
    greatest(`1`, `2`, ... `10`) as opLevel
FROM 
    list l 
        LEFT JOIN operators o 
            ON l.operator_id = o.operators_id 
WHERE 
    l.user_id=1 
ORDER BY 
    o.10 DESC

编辑:好的,根据其他信息,您可以使用以下 (ick ick ick) 语句:

select
    l.list_id,
    l.user_id,
    l.operator_id,
    l.operator_name,
    l.operator_level,
    case
        when l.operator_level=1 then o.`1`
        when l.operator_level=2 then o.`2`
        when l.operator_level=3 then o.`3`
        // etc etc yuck!
        when l.operator_level=10 then o.`10`
    end as yicky
FROM 
    list l 
        LEFT JOIN operators o 
            ON l.operator_id = o.operators_id 
WHERE 
    l.user_id=1 
ORDER BY 
    o.10 DESC

编辑2:

我强烈建议数据标准化。

鉴于您拥有的数据,您似乎正在将数据复制给各种用户。这听起来有点像一场噩梦更新。据我了解,似乎每种“技能”都有一个薪资等级,并且根据操作者的级别而上涨?

我将制作一个具有以下结构的表格(基于用户 1 的假设):

skill   level   value
 B32     1   25
 B32     2   30
.....
 B32     10  75
 F16     1   25
 F16     2   30
...
 F16     10  75

然后,您可以简单地执行从“列表”表到“运算符(operator)”表的链接,然后根据其中的数据链接到“成绩”表。

这将使查询变得更加简单。

话虽如此,我实际上会考虑将“运算符(operator)”表标准化为仅包含技能。将“类型”和“图像”移至“列表”表中(并在此处将其称为“用户”)。

现在“运算符(operator)”表应重命名为技能组表,其中包含如下数据:

userID  skill   Level
 1   F16     4
 1   B32     8
 2   F_Aid   2

这将允许您拥有拥有 3 种以上技能的用户,并允许您轻松记录用户的每个技能级别。他们在 B32 时可能是 super 英雄,但在 F16 时只是平庸。

关于php - 如何 JOIN 表以获得表 A 的全部内容和表 B 的大部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23866244/

相关文章:

c# - 如何在 C# 中为 Firebird 执行 block 语句

php - 如何为表中的多行设置相同的id

javascript - 如何在codemirror编辑器中设置不同的尺寸?

php - 我可以检查 PHP 中是否存在 Apache 模块吗?

mysql - 如何对 "N-nearest neighbors?"执行多维搜索

java - 将 SQL 查询结果写入 csv 失败 : uncomplete line

php - 在 Laravel Controller 中检索 GET 和 POST 数据

php - 保护 PHP Web 服务/相关连接数据的最佳方式?

php - Opencart - 搜索不考虑口音

sql - 非规范化 SQL 查询和组合列