2016-08-17 62 views
0

在MySQL返回2个不同的价值观,我有2个表和类似的查询:SQL选择必须在1行从2个表

SELECT t1.id, t1.desc_short, t2.body FROM table1 t1, table2 t2 WHERE t1.desc_short = t2.name AND t1.id = 100321654 

table1的包含对象,表2中含有的字符串名称(表2,表3。 ..,tableN是语言表)

我的问题是,在t1中,我有列名称是对象的名称,所以我去table2的字符串,并且我也有在t1列'desc'这是对象的描述,也可以在表2中找到,但不是同一行。

表1(对象)是这样的:

id  |  desc_short  | desc_long 
169461235 | STR_DESC_SHORT1 | STR_DESC_LONG1 

表2是这样的:

id  |  name  | body 
10000 | STR_DESC_SHORT1 | name of object 169461235 
10354 | STR_DESC_LONG1 | desc of object 169461235 

是否有可能,在一个SQL查询,返回只有一行,赶上名和一个递减特定对象?

编辑:已添加表格示例。对不起,列名混淆。所以,在一个选择返回一行,我需要:

id  |   desc_short   |   desc_long 
169461235 | name of object 169461235 | desc of object 169461235 
+0

请你可以修改你的例子,使它更有意义;请举一个表1的例子,在你的表2的例子中,你是否真的想给第二行另一个名字和ID作为第一行?如果这是正确的,我不明白他们的关系。 – Nick

+0

这个措词似乎矛盾_“table2包含他们的字符串名称”_和_“在t1我有列名'是对象的名称'_ – Uueerdo

+0

对不起,对于这些家伙,感谢您的帮助。我更新了帖子。 –

回答

1

你需要加入到你的“字符串表“两声,像这样:

SELECT t1.id, nameTbl.body AS `nameStr`, descTbl.body AS `descStr` 
FROM table1 AS t1 
INNER JOIN table2 AS nameTbl ON t1.DESC_SHORT = nameTbl.name 
INNER JOIN table2 AS descTbl ON t1.DESC_LONG = descTbl.name 
WHERE t1.id = 100321654 
; 
+0

这是工作!非常感谢 ! (t1.name不存在了,我编辑了我的帖子而不更改列名) –

+0

我使用了LEFT JOIN而不是INNER JOIN,因为即使没有在第二个表中找到任何东西,我也需要该记录。 –

0

如果对象名称是一样的,你可以使用像

SELECT t1.id, t1.name, t2.body 
FROM table1 t1, table2 t2 
WHERE t2.body like concat('%', t1.id, '%') 
OR t2.body like concat('%', t1.id) 
OR t2.body like concat(t1.id, '%') 
AND t1.id = 100321654 
+0

对不起,他们不一样,我在帖子中添加了更多信息和表格内容示例。 –

+0

我有第一个建议更新答案.. – scaisEdge

0

你可以加入表上两倍,在你的例子如下,但我会选择可能的话更多一些描述性的字段名:

SELECT t1.id 
     ,t2name.body as DESC_SHORT 
     ,t2desc.body as DESC_LONG 
FROM table1 t1 
LEFT JOIN 
table2 t2name WHERE t1.DESC_SHORT = t2.name 
LEFT JOIN 
table2 t2desc WHERE t1.DESC_LONG = t2.name 
相关问题