我有一个问题跟踪网络应用程序表,可以将问题映射到故障单号码。给定的问题可以(假设地)映射到它的无限数量的票证。我想做一个SQL查询,它会产生一个可能附加多个票据的问题。
例如:
issue_id | ticket_id
--------------------
1 | 100
1 | 101
2 | 101
(SQL小提琴:http://sqlfiddle.com/#!2/b3c34/3)
(一点背景)我正在为这个网络应用程序开发一个新的搜索页面,其中一个可搜索的字段是票号。用户可以指定要搜索的任意数量的票号。
因此,假设用户正在尝试查找所有已将票号100和101映射到它们的问题编号。以下SQL查询不返回任何行:
select issue_id
from tickets
where ticket_id = 100 and ticket_id = 101;
有人能指出我正确的方向吗?有没有办法用一个查询有效地完成上述操作?请注意,查询中可能会返回数百个问题编号(故障单编号只是一个更大的查询的一小部分),所以我希望这一点尽可能简单。
感谢。
答案 0 :(得分:1)
select issue_id
from tickets
where ticket_id in (101,102)
group by issue_id
having count(distinct ticket_id) = 2
答案 1 :(得分:1)
您的tickets
表大概应该是Junction Table。然而...
select distinct issue_id
from tickets t
where exists (select 1 from tickets where ticket_id = 100 and issue_id = t.issue_id)
and exists (select 1 from tickets where ticket_id = 101 and issue_id = t.issue_id);
或者:
select distinct issue_id
from tickets
where issue_id in (select issue_id from tickets where ticket_id = 100)
and issue_id in (select issue_id from tickets where ticket_id = 101);
会做你要求的。后者通常更容易理解,但前者通常表现更好。
你也可以这样做,但它是一个设定的操作查询,而且经常不鼓励。但是,SQLFiddle的执行计划表明这是三者中最好的。
select issue_id from tickets where ticket_id = 100
intersect
select issue_id from tickets where ticket_id = 101;
至少还有一种其他方式可以使用自我INNER JOIN
。
答案 2 :(得分:0)
另一种选择:
select ticket100.issue_id
from (select issue_id from tickets where ticket_id = 100) as ticket100
inner join (select issue_id from tickets where ticket_id = 101) as ticket101
on ticket100.issue_id = ticket101.issue_id
不知道这取决于性能表,但这是我想到的。