MySQL:如果ID与表B中的2(或任意n)行匹配,则从表A中选择

发布于 2024-10-12 18:11:51 字数 648 浏览 4 评论 0原文

该场景非常简单:我在表 A 中有内容,在表 B 中有内容标签:

Table A:
+----+-------+-...
| id | title | ...
+----+-------+-...

Table B:
+------+-----+
| id_A | tag |
+------+-----+

我想选择 A 中具有标签“foo”的所有内容行:

SELECT A.* FROM A, B WHERE A.id = B.id_A AND B.tag = 'foo'

到目前为止,这很简单。

我的问题是:如何选择具有两者标签“foo”标签“bar”的内容行?特别是,如何选择具有 n 标签 'foo'、'bar'、... 的行,用于 任意 n > 1

一个解决方案是加入 B n 次,但这感觉很糟糕,而且我认为它的性能并不好。

由于我使用 MySQL、PHP 和 PDO 以及准备好的语句,如果有一个解决方案在 PHP 部分中不需要必要的字符串连接(如“加入 n 次”解决方案),那将是我的最喜欢的。

The scenario is quite straight forward: I have content in table A and tags for contents in table B:

Table A:
+----+-------+-...
| id | title | ...
+----+-------+-...

Table B:
+------+-----+
| id_A | tag |
+------+-----+

I want to select all content rows in A, that have tag 'foo':

SELECT A.* FROM A, B WHERE A.id = B.id_A AND B.tag = 'foo'

So far, that's simple.

My problem is: How can I select content rows, that have both tag 'foo' and tag 'bar'? Especially, how can I select rows that have n tags 'foo', 'bar', ... for arbitrary n > 1?

A solution would be to join B n times, but that feels bad, and I assume, that it's not really performant.

Since I use MySQL, PHP and PDO with prepared statements, if there is a solution that goes without necessary string concatenation (like in the 'Join n times' solution) in the PHP part, that would be my favourite.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

殊姿 2024-10-19 18:11:51
SELECT  *
FROM    a
WHERE   (
        SELECT  COUNT(*)
        FROM    b
        WHERE   b.id_a = a.id
                AND b.tag IN ('foo', 'bar', 'baz')
        ) = 3
SELECT  *
FROM    a
WHERE   (
        SELECT  COUNT(*)
        FROM    b
        WHERE   b.id_a = a.id
                AND b.tag IN ('foo', 'bar', 'baz')
        ) = 3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文