【问题标题】:Extract linked data from one row in one table to multiple rows in another table从一个表中的一行中提取链接数据到另一个表中的多行
【发布时间】:2012-05-27 13:52:35
【问题描述】:

我正在创建一个游戏,并且需要根据单行中列出的 ID 值从表(表 1)中选择名称。

行示例

行 ID 单元 1 单元 2 单元 3 单元 4

假设第 1 行填充了单位为的数据

wfmatch 行 ID 单元 1 单元 2 单元 3 单元 4 ----- ----- ----- ----- ----- 1 1 2 3 4

然后在我的第二张表中 (Table2) 我有实际姓名

wfunits 单位 ID 名称 ------ ---------- 1 首件 2 第二项 3 第三项 4 第四项

在一个查询中或尽可能接近,我希望能够获得从第一个表中列出的 ID 的名称,结果如下:

这是使用底部代码实现的最终结果。 (+4 个名字) 行 ID 单元 1 单元 2 单元 3 单元 4 ----- --------- ---------- --------- ---------- 1 第一项 第二项 第三项 第四项

我曾经尝试过 JOIN 语句,但到目前为止我一直缺乏关于如何正确使用它们的知识,我觉得这可能是获得结果的方法,我只是想不通。

编辑: 尝试的代码

SELECT * FROM wfmatch AS t1 INNER JOIN wfunits AS t2 ON t1.crunit1 = t2.id WHERE t1.mid = 1

结果:否定,只提供了一个名字。

工作最终结果:

SELECT
m.mid, u1.name AS Unit1, u2.name AS Unit2, u3.name AS Unit3, u4.name AS Unit4,
u5.name AS Unit5, u6.name AS Unit6, u7.name AS Unit7, u8.name AS Unit8
FROM wfmatch AS m  
INNER JOIN wfunits AS u1 ON m.crunit1=u1.id  
INNER JOIN wfunits AS u2 ON m.crunit2=u2.id 
INNER JOIN wfunits AS u3 ON m.crunit3=u3.id 
INNER JOIN wfunits AS u4 ON m.crunit4 =u4.id 
INNER JOIN wfunits AS u5 ON m.counit1=u5.id 
INNER JOIN wfunits AS u6 ON m.counit2=u6.id 
INNER JOIN wfunits AS u7 ON m.counit3=u7.id  
INNER JOIN wfunits AS u8 ON m.counit4 =u8.id 
WHERE mid=1

【问题讨论】:

  • 感谢@Andriy M,无法确定格式。

标签: php mysql select join associations


【解决方案1】:

您可能需要四个连接,每列一个,如下所示:

SELECT
  m.RefID,
  u1.Name AS Unit1,
  u2.Name AS Unit2,
  u3.Name AS Unit3,
  u4.Name AS Unit4
FROM Table1 AS m
  INNER JOIN Table2 AS u1 ON m.Unit1 = u1.UnitID
  INNER JOIN Table2 AS u2 ON m.Unit2 = u2.UnitID
  INNER JOIN Table2 AS u3 ON m.Unit3 = u3.UnitID
  INNER JOIN Table2 AS u4 ON m.Unit4 = u4.UnitID

还有一个替代方案,虽然我不确定它是否会更好:

SELECT
  m.RefID,
  MAX(CASE u.UnitID WHEN m.Unit1 THEN u.Name END) AS Unit1,
  MAX(CASE u.UnitID WHEN m.Unit2 THEN u.Name END) AS Unit2,
  MAX(CASE u.UnitID WHEN m.Unit3 THEN u.Name END) AS Unit3,
  MAX(CASE u.UnitID WHEN m.Unit4 THEN u.Name END) AS Unit4
FROM Table1 AS m
  INNER JOIN Table2 AS u ON u.UnitID IN (m.Unit1, m.Unit2, m.Unit3, m.Unit4)
GROUP BY m.RefID

【讨论】:

  • 我回家后会测试这个并发布结果
  • 最有用的东西。迫不及待想回家,所以手机查询它
  • 我更喜欢第二个版本,因为它与空字段无关
  • @Adsy2010:啊,但在这种情况下,您也可以修改第一个使其对 NULL 友好。只需使用LEFT JOINs 而不是INNER JOINs。
  • @Adsy2010:如果需要,您可以在this MySQL manual page 上阅读有关 MySQL 连接的更多信息。
【解决方案2】:

这样的事情可能对你有用:

SELECT *
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.id = t2.id
WHERE t1.rowid = ?

【讨论】:

  • SELECT * FROM wfmatch AS t1 INNER JOIN wfunits AS t2 ON t1.cunit1 = t2.id WHERE t1.mid = 1 是我尝试的代码,是的,它显示 1 个名称但不显示 4。我也有: t1.crunit2 t1.crunit3 t1.crunit4 来获取 + 另一组 4 的名称,但是一旦我知道如何获得 4 或接近,我就可以弄清楚其余的了
  • 看来您的回答是正确的,感谢您的贡献。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多