【问题标题】:Select one row from multiple tables that only exists in one of the tables从仅存在于其中一个表中的多个表中选择一行
【发布时间】:2020-01-03 18:45:01
【问题描述】:

我有一个有两个表的 mysql 数据库:

table1: 
id, stuff, more_stuff, something

table2:
id, stuff, more_stuff, something, even_more

由于安全/可靠性原因,表 1 和表 2 的 id 是不相交的集合非常重要。这意味着table1.id 永远不会是table2.id

编辑:我不知道 id=given_id 在两个表中的哪一个为真。

现在我想select * from table1 or table2 where id=given_id。这意味着只有一个表有一行 id=given_id,我希望返回该行。我不能用 UNION 做到这一点,因为我的两个表长度不同。

当然我可以用两个语句来做到这一点,但这需要我对数据库运行两个查询。

有没有办法从两个表中选择一行,具体取决于它在表中的位置?

【问题讨论】:

  • 联合所有表格。
  • 那么对应的错误是:The used SELECT statements have a different number of columns
  • 添加一个虚拟null作为table1选择的最后一列。
  • 那么算了吧。这个安全原因听起来很荒谬。除了隐藏 ID,还有其他方法可以保护数据库数据
  • 最好在前端做这个;运行两个查询。我总是无法理解那些寻求“只运行一个查询”的人,因为它可以节省数据库一些时间,然后他们去寻找一些真正可怕的技术来连接或合并数据,这将浪费更多的时间和计算资源......数据库擅长运行简单的语句,例如“从 indexedcolumn = value 的表中选择 *”,企业系统每秒在其企业数据库中处理数千个此类查询

标签: mysql sql select mariadb


【解决方案1】:

我认为 id 列上的 FULL OUTER JOIN 可以帮助你。

select coalesce(t1.id, t2.id) as id,
       coalesce(t1.stuff, t2.stuff) as stuff,
       coalesce(null, t2.even_more) as event_more
from t1 full outer join t2 
     on t1.id = t2.id
where coalesce(t1.id, t2.id) = MY_DESIRED_ID

【讨论】:

  • 他说id不一样;为什么数据库要浪费时间尝试加入无法加入的数据?这也有可能表现得像狗一样
  • MySQL中没有Full Outer Join!!
【解决方案2】:

好吧,你仍然可以做一个UNION ALL,就像这个(你只需要使用命名列):

SELECT * FROM (
 SELECT 2 tbl, id, stuff, more_stuff, something, 
        even_more, and_more_stuff FROM table2
 UNION ALL
 SELECT 1 tbl, id, stuff, more_stuff, something, 
        null,      null           FROM table1
) both WHERE id = MY_DESIRED_ID

我在第一列tbl 中添加了表格编号,以便您始终知道您在哪个表格中找到了相关记录。

只是按照@Caius 的建议稍作更改:首先提到更广泛的表可以避免在列列表中提供别名。

【讨论】:

  • 1 tbl 列是天才 :)
  • 如果我的头顶着枪,而经理拒绝让我从前端运行两个查询,我会这样做。我也会把带有额外列的表格放在第一位
  • 两个单独的查询甚至会比这更好。至少应该将 WHERE 条件应用于两个内部 SELECT 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多