首页 > 解决方案 > 如何使用 FROM 子句中的子查询优化 MariaDB 查询?

问题描述

想象一下这两张桌子。

表 A

ID col1 col2 col3
1  foo  baz  bar
2  ofo  zba  rba
3  oof  abz  abr

表 B

A_ID field_name field_value
1    first      Jon
1    last       Doe
2    first      Adam
2    last       Smith

ETC..

现在我想要一个查询(当前的看起来像这样)

SELECT 
    a.id, 
    a.col1, 
    a.col2, 
    (SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'first') as first_name, 
    (SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'last') as last_name
FROM A a
WHERE (SELECT COUNT(*) FROM B WHERE A_ID = a.id) = 2;

此查询有效。我想要实现的是这样的。

SELECT 
  a.id,
  a.col1,
  a.col2,
  (SELECT field_value FROM b WHERE b.field_name = 'first') as first_name,
  (SELECT field_value FROM b WHERE b.field_name = 'last') as last_name
FROM
  A a,
  (SELECT field_value, field_name FROM B WHERE A_ID = a.id) b
WHERE (SELECT COUNT(*) FROM b) = 2;

我的方法看起来如何正确?有没有其他方法可以摆脱表B的多个查询?

谢谢!

标签: subquerymariadbentity-attribute-value

解决方案


我会用连接替换您的相关子查询:

SELECT 
    a.id, 
    a.col1, 
    a.col2,
    b1.field_value AS fv1,
    b2.field_value AS fv2
FROM A a
LEFT JOIN B b1
    ON a.id = b1.A_ID AND b1.field_name = 'first'
LEFT JOIN B b2
    ON a.id = b2.A_ID AND b2.field_name = 'last';

此答案假定来自给定 A 记录的左连接最多只能匹配 B 表中的一条记录,但是,无论如何,这对于您的相关子查询只返回一个值是一个要求。


推荐阅读