我很确定我需要 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添加了示例数据,不知道如何在那里添加预期结果。
最佳答案
您已经掌握了外连接的基础知识,但您可以做的是限制您在查询中选择的字段,如下所示:
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/