我有一张像;
的桌子表A
4c4fedf7 OMoy3Hoa
4c4fedf7 yiWDGB4D
broe4AMb A9rLRawV
broe4AMb mi9rLmZW
nhrtK9ce yEsBoYLj
rEEtK9gt A9rLRawV
rEEtK9gt mi9rLmZW
rEEtK9Hh A9rLRawV
rEEtK9Hh msBWz8CQ
如果我提供A9rLRawV
,mi9rLmZW
之类的输入。我想输出像;
broe4AMb
rEEtK9gt
输出是A9rLRawV
,mi9rLmZW
组合的结果。此处,broe4AMb
和rEEtK9gt
都在表格中关联了A9rLRawV
和mi9rLmZW
。我提出了一个问题,但是得到的输出就像;
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来实现这一目标?我该怎么做/解决这个问题?
答案 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
我更喜欢这种方法,因为它比你所指示的自连接更好地扩展。传递两个参数:一个用于标签,一个用于标签数量。 (我希望你在PHP中使用参数化查询)对于自联接,你必须编写动态SQL来处理每个附加标记,这样如果你有3,4,5个连接。这样你就可以传入5个数值和数字5;并获得所有匹配的列表。
答案 1 :(得分:1)
就像你假设的那样,自我加入会有所帮助。使用此查询
A9rLRawV
这里你自己加入表格,匹配对有a
(在主表mi9rLmZW
)和b
(在联合表broe4AMb
rEEtK9gt
中)
这是您更新的SQL小提琴:http://sqlfiddle.com/#!9/12223/13
结果如愿:
-Xmx