【问题标题】:Select form table A where value in table B选择表 A 表 B 中的值
【发布时间】:2013-02-09 10:34:53
【问题描述】:

表 A

id    name
1     name1
2     name2
3     name3
4     name4

表 B

id    userlist
1     1,2,3,4

我现在要做的是

SELECT `userlist` FROM `table B` WHERE `id` = 1

然后保存结果并放入第二个查询

SELECT `name` FROM `table A` WHERE `id` in ($userlist)

只是想知道是否有更好的方法。我试试

SELECT `name` FROM `table A` WHERE `id` in (SELECT `userlist` FROM `table B` WHERE `table B`.`id` = 1)

但它只返回 1 个结果。

编辑*

数据库结构无法更改,因为里面有这么多数据。我只是尝试优化旧代码。

【问题讨论】:

  • 在表的单个字段中使用逗号分隔值通常是个坏主意。您应该考虑您的数据表示。
  • 标准化你的数据库,然后你可以使用INWHERE EXISTS
  • "数据库结构无法更改,因为里面有这么多数据" - 为什么数据库中的数据量会阻止您更改其结构?架构更改可以通过为您执行所有重组的数据库查询来实现。
  • @eggyal 哦,好的。但是我需要确保所有新的插入数据都可以在更改数据库之前匹配这个新的数据库结构?如果不是,它可能会导致错误。目前,我只是一点一点地优化,没有做大的改变,因为我并不完全了解整个架构

标签: mysql


【解决方案1】:

你可以使用FIND_IN_SET:

SELECT `name`
FROM `table A` INNER JOIN `table B` ON
     FIND_IN_SET(`table A`.`id`, `table B`.`userlist`)
WHERE `table B`.`id` = 1

但我建议您将表格标准化。

【讨论】:

    【解决方案2】:

    解决此问题的正确方法是更改​​表定义并使用 JOIN。例如

    表 A

    id    name    b_id
    1     name1   1
    2     name2   1
    3     name3   1
    4     name4   1
    

    表 B

    id    
    1  
    

    要从表 A 中获取 B id 为 1 的名称,您可以编写:

    select name from A join B on A.b_id = B.id where B.id = 1
    

    或者,如果无法更改表 A,则定义一个新表来维护 A-B 关系:

    表 A

    id    name
    1     name1
    2     name2
    3     name3
    4     name4
    

    表 B

    id    
    1     
    

    表 A_B​​p>

    a_id b_id
    1    1
    2    1
    3    1
    4    1
    

    提取数据的SQL:

    select name from A join A_B on A.id = A_B.b_id where A_B.b_id = 1
    

    【讨论】:

    • 感谢您的回答。很抱歉告诉你。数据库结构不能改变,因为我不是创建它的人。我只是尝试优化它。
    • @MuhammadAzizol 告诉创建表格的 derp 然后改进它们。或者更好的是,用重物打击他 :) 非规范化表是一种邪恶,最好立即根除,而不是稍后处理。
    • @AndreasGrapentin 我愿意。但他已经离开了公司。现在他所有的工作都交给我了,我必须承担责任
    • @MuhammadAzizol 那么问题出在哪里?重做,做对:)
    • @AndreasGrapentin 是的,那是我的计划。但是现在我需要让它更快,因为软件已经上线了。
    猜你喜欢
    • 2019-05-16
    • 2013-03-31
    • 2015-08-04
    • 1970-01-01
    • 2011-06-25
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多