【问题标题】:SQL Select must return in 1 row 2 different values from 2 tablesSQL Select 必须在 1 行中从 2 个表中返回 2 个不同的值
【发布时间】:2016-12-24 10:46:02
【问题描述】:

在 MySQL 中,我有 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 包含 Objects,table2 包含它们的字符串名称(table2、table3、...、tableN 是语言表)

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

table1(对象)是这样的:

    id     |     desc_short     |   desc_long
169461235  |  STR_DESC_SHORT1   | STR_DESC_LONG1

Table2 是这样的:

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

是否有可能在一个只返回一行的 SQL 查询中捕获一个特定对象的名称和描述?

编辑:添加了表格示例。抱歉,列名令人困惑。因此,在一个返回一行的 SELECT 中,我需要:

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

【问题讨论】:

  • 请您修改您的示例,使其更有意义;请举一个表 1 的例子,在你的表 2 例子中,你真的是想给第二行一个与第一行不同的名称和 ID 吗?如果这是正确的,我看不出它们之间的关系。
  • 这个措辞似乎是矛盾的“table2包含他们的字符串名称”“在t1中我有列'name'是对象的名称”
  • 对不起那些家伙,谢谢你的帮助。我已经更新了帖子。

标签: mysql


【解决方案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
;

【讨论】:

  • 那行得通!太感谢了 ! (t1.name 不再存在,我已经编辑了我的帖子而没有更改列名)
  • 我使用了 LEFT JOIN 而不是 INNER JOIN,因为即使在第二个表中找不到任何内容,我也需要记录。
【解决方案2】:

在您的示例中,您可以按以下方式加入表格两次,但如果可能的话,我会选择一些更具描述性的字段名称:

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 

【讨论】:

    【解决方案3】:

    如果对象名称相同,您可以使用 like

    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
    

    【讨论】:

    • 对不起,它们不一样,我在帖子中添加了更多信息和表格内容示例。
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多