已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
5天前关闭。
Improve this question
我有两个表,它们表示一对多的关系CREATE TABLE a( id int, a_text varchar(255) );
然后呢CREATE TABLE b( a_id int, b_text varchar(255) );
其中列b_text
包含枚举值。
表A:
| 身份证|a_text|
| - -----|- -----|
| 一个|'文本1'|
| 2| '文本2'|
表B:
| a_id| B_text|
| - -----|- -----|
| 一个|'状态1'|
| 一个|'状态2'|
| 2| '状态1'|
| 一个|'状态3'|
我想写一个SELECT查询,其中有几个b_text
值作为参数,它返回表a
中的所有行,这些行在连接后只包含给定的b_text
值。例如,我想从表a
中获取只有b_text
值status_1和status_2的所有行。因此,id
=1的行将被返回。
问题是:有没有一种方法可以编写一个通用的SQL查询,而不依赖于参数的数量?
我有一个解决方案,我只是用where语句为一个特定的值添加一个新的JOIN到B表中,但它不适合,因为没有办法动态添加一个新的join
3条答案
按热度按时间eulz3vhy1#
您可以使用intersect:
或者,您可以在以下情况下使用:
klr1opcd2#
编写查询的直接方法是:
这意味着对于每个状态,您必须添加一个带有
AND
的条件。如果希望查询不随条件的数量而变化,则必须将所需的状态存储在单独的表中。例如,查询可能看起来像这样:
或者,使用逗号分隔的列表代替单独的表(例如
'status 1,status 2'
)沿着FIND_IN_SET
。演示:https://dbfiddle.uk/0dC-PbEQ
mepcadol3#
在性能方面,我使用
exists
和limit 1
,因为我发现使用适当的索引,检查的行更少。现在我们为a添加一个索引,为B添加另一个索引:
注意:
limit 1
子句实际上是多余的,因为EXISTS
子查询隐式地覆盖了它。