如何通过选择特定列中相关数据的组合来从表中选择行? MySQL的

时间:2015-12-09 19:37:05

标签: php mysql

我有一张像;

的桌子

表A

tablea

4c4fedf7    OMoy3Hoa
4c4fedf7    yiWDGB4D
broe4AMb    A9rLRawV
broe4AMb    mi9rLmZW
nhrtK9ce    yEsBoYLj
rEEtK9gt    A9rLRawV
rEEtK9gt    mi9rLmZW
rEEtK9Hh    A9rLRawV
rEEtK9Hh    msBWz8CQ

如果我提供A9rLRawVmi9rLmZW之类的输入。我想输出像;

broe4AMb
rEEtK9gt

输出是A9rLRawVmi9rLmZW组合的结果。此处,broe4AMbrEEtK9gt都在表格中关联了A9rLRawVmi9rLmZW。我提出了一个问题,但是得到的输出就像;

broe4AMb
rEEtK9gt
rEEtK9Hh

我的查询就像;

SELECT DISTINCT prodid
FROM tablea
WHERE tagid IN ('A9rLRawV','mi9rLmZW');

输出是这样的,因为我认为reetK9Hh在表格中与A9rLRawV相关联。但我不希望该条目显示,因为它没有mi9rLmZW与之关联。

这是SQL小提琴http://sqlfiddle.com/#!9/12223/2/0

是否需要自我加入。什么是最有效的'方法?是否可以单独使用MySQL或支持PHP来实现这一目标?我该怎么做/解决这个问题?

2 个答案:

答案 0 :(得分:2)

我坚信只有SQL才能解决这个问题。从数据库中获取所需的数据。让PHP做演示。为什么?通常,数据库可以比通过Web服务器/中间件服务器上的代码更快地解析数据。

关于如何...阅读having条款和group by

我在这里做的是按prodID分组以确保返回所有prodID。 mySQL扩展了group by子句,虽然它可能允许having子句在没有group by的情况下存在,但如果没有prodid分组,你将无法获得所需的结果。有一个获得在哪里请求的两个标签的明确计数。注意:我在tagID上添加了distinct,因为我不确定您的整体数据是否可以为每个prodid重复tagId。如果我们知道价值观是不同的,我们就可以消除它。

#可以根据需要提供的TagID数量动态设置。

SELECT prodid
FROM tablea
WHERE tagID in ('A9rLRawV','mi9rLmZW')
GROUP BY  prodid
HAVING count(distinct tagID)=2

SQL FIddle

我更喜欢这种方法,因为它比你所指示的自连接更好地扩展。传递两个参数:一个用于标签,一个用于标签数量。 (我希望你在PHP中使用参数化查询)对于自联接,你必须编写动态SQL来处理每个附加标记,这样如果你有3,4,5个连接。这样你就可以传入5个数值和数字5;并获得所有匹配的列表。

答案 1 :(得分:1)

就像你假设的那样,自我加入会有所帮助。使用此查询

A9rLRawV

这里你自己加入表格,匹配对有a(在主表mi9rLmZW)和b(在联合表broe4AMb rEEtK9gt 中)

这是您更新的SQL小提琴:http://sqlfiddle.com/#!9/12223/13

结果如愿:

-Xmx