使用另一个表的过滤器从Union x 3中进行选择

时间:2013-05-16 20:24:12

标签: mysql sql database select

背景

我有一个Web应用程序,必须从其他表中删除条目,通过表1中的“tielists”选择过滤 - > item_table 1,表2,表3 ....现在基本上我的结果集将是肮脏的大,除非我使用user_id来使用另一个表中的过滤器语句...所以有人可以帮助我根据需要构建我的语句? TY!

cars_belonging_to_user
-----------------------------
ID | user_id | make   | model
----------------------------
1  |  1      | Toyota | Camry
2  |  1      |Infinity| Q55
3  |  1      | DMC    | DeLorean
4  |  2      | Acura  | RSX

Okay, Now the three 'tielists'
name:tielist_one
----------------------------
id | id_of_car | id_x | id_y|
1  | 1         | 12   | 22  |
2  | 2         | 23   | 32  |
-----------------------------
name:tielist_two
-------------------------------
id | id_of_car | id_x | id_z|
1  |  3        | 32   | 22  |
-----------------------------
name: tielist_three
id | id_of_car | id_x | id_a|
 1 | 4         | 45   | 2   |
------------------------------

结果集和代码

echo name_of_tielist_table
// I can structure if statements to echo result sets based upon the name
// Future Methodology: if car_id is in tielist_one, delete id_x from x_table, delete id_y from y_table...
// My output should be a double select base:
--SELECT * tielists from WHERE car_id is 1... output name of tielist... then
--SELECT * from specific_tielist where car_id is 1.....delete x_table, delete y_table...

考虑到列表将是庞大的,并且tielist同样长,我必须过滤结果car_id(id) = $variable && user_id = $id....

附注

  1. 任何单一的传教士中只会出现一次车识别。

  2. 此select语句必须使用user_id = $ variable ...进行过滤(并记住,我正在寻找哪个车辆ID)

  3. 我必须拥有它能够被变成变量的传递者的名字......

  4. 我将在任何给定时间只查找一个id_of_car,因为此选择将包含在foreach循环中。

  5. 我在考虑union all个项目可以选择行,但是如何获取行所在的tielist的名称,以及如何从user_id使用过滤器行

1 个答案:

答案 0 :(得分:1)

如果您想要表现,我建议left outer join而不是union all。这将允许查询为您的目的有效地使用索引。

根据您的说法,汽车恰好是其中一个列表。这对于这种方法起作用很重要。这是SQL:

select cu.*,
       coalesce(tl1.id_x, tl2.id_x, tl3.id_x) as id_x,
       tl1.y, tl2.idz, tl3.id_a,
       (case when tl1.id is not null then 'One'
             when tl2.id is not null then 'Two'
             when tl3.id is not null then 'Three'
        end) as TieList
from Cars_Belonging_To_User cu left ouer join
     TieList_One tl1
     on cu.id_of_car = tl1.id_of_car left outer join
     TieList_Two tl2
     on cu.id_of_car = tl2.id_of_car left outer join
     TieList_Three tl3
     on cu.id_of_car = tl3.id_of_car;

然后,您可以根据需要添加where子句进行过滤。

如果每个tielist表都有id_of_car的索引,那么性能应该非常好。如果where子句在第一个表上使用索引,那么连接和应该在哪里使用索引,并且查询将非常快。