MySQL,根据列值从不同的行中选择

Posted

技术标签:

【中文标题】MySQL,根据列值从不同的行中选择【英文标题】:MySQL, selecting from a different row based on column value 【发布时间】:2014-09-01 07:45:56 【问题描述】:

我有下表

---------------------------
|ID  |Image      | link    |
|01  |           | 02      |  
|02  |steve.jpg  |         |         
|03  |eric.jpg   |         |         
----------------------------

链接字段存储ID,所以我可以设置两行之间的关系。

ID 01 的链接字段设置为 02。所以我希望 ID 01 使用 ID 设置在该字段中的图像,所以它将是 steve.jpg。

如何获取所有行,以便设置了链接字段的行以该图像结束?

【问题讨论】:

多么奇怪的架构。为什么链接和图片在同一张表中? 这是一个非常好的自毁架构:) 您应该将链接放在另一个表中。为什么在同一个表中? 请向我们展示您的预期结果 【参考方案1】:

您可以使用自连接来显示链接 ID 的图像名称

select t.*,t1.Image as link_image
from t 
left join t t1 on(t.link = t1.ID)

Demo

【讨论】:

【参考方案2】:
SELECT a.id, b.image, a.link
FROM YourTable AS a
JOIN YourTable AS b ON a.link = b.id
UNION
SELECT id, image, link
FROM YourTable
WHERE link IS NULL

【讨论】:

谢谢。我已经尝试过了。它只会选择具有 ID 和链接的行。我需要所有行,但我需要用链接字段中的图像替换图像 我添加了一个UNION 来获取其他行。【参考方案3】:

类似这样的:

(SELECT ID, Image from mytable WHERE link = '' )
UNION ALL
(SELECT m1.ID as ID, m2.Image as Image 
   FROM mytable AS m1 INNER JOIN mytable AS m2 ON ( m1.link=m2.ID )
)

【讨论】:

实际上看起来它也能满足我的需要。您正在选择没有链接的所有行,然后加入这些行以便我们获得所有行,而不仅仅是具有关系的行 @user933791 使用左连接。联合会慢很多。 @JohnRuddell 也许桌子太小而无法考虑速度。 “联合”解决了这个问题并保持了行的格式。 @MichaelLivach 和左连接不保持格式?您甚至看过mkhalid的答案吗?发布的演示显示它将从表中提取所有内容,然后添加图像名称(如果存在)..并且代码更加简洁。 @JohnRuddell 是的,我看了。在 mkhalid 的解决方案中,您有 2 列(“Image”和“link_image”)而不是 1

以上是关于MySQL,根据列值从不同的行中选择的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列值从 DataFrame 中选择行?

如何根据列值从 DataFrame 中选择行?

如何根据列值从 DataFrame 中选择行?

根据同一行中的另一个值从行中选择某个值

根据列值从熊猫数据框中提取行

ExtJS 3:如何根据行中的值对不同的行定义不同的操作?