2010-03-23 44 views
1

我在建立查询时遇到问题。我可以在3种不同的查询中做我想要的。帮助抓住(INNER?)加入

SELECT id FROM table1 WHERE url LIKE '%/$downloadfile' 
put that in $url_id 
SELECT item_id FROM table2 WHERE rel_id = '$url_id'" 
put that in $item_id 
SELECT rel_id FROM table2 WHERE rel_id = '$item_id' AND field_id = '42'" 
put that in $user_id 

但是通过阅读关于连接和内部连接的示例,我认为有一种更优雅的方式。我不能换我的大脑周围写一个更好的查询(但想)我可以形容它应该怎么走:

table1的 字段:ID,网址

表2个 领域ITEM_ID,rel_id,FIELD_ID

我知道table1.url的最后一部分(LIKE'%/ $ filename'),我选择了table1.id。 table1.id等于table2.rel_id中的一个条目。所以得到它并选择table2.item_id。 在表2中有另一个具有相同table2.item_id的条目,它将有一个table2.field_id ='42' 最后,我需要的值是table2.rel_id,其中table2.field_id是42. 我将获取该值,并把它放在$ user_id

这可以通过一个使用连接/内部连接的查询来完成吗?

回答

2
SELECT url, second.rel_id AS user_id 
FROM table1 
INNER JOIN table2 AS first 
    ON table1.id=first.rel_id 
INNER JOIN table2 AS second 
    ON first.item_id=second.rel_id 
WHERE second.field_id='42' 
    AND table1.url LIKE '%/:downloadfile' 
+0

Yay it works!在第二次内部连接中有一个小的变化,请参阅我的答案。我甚至得到了同一张表的双重实例:P – ugreen 2010-03-23 23:44:06

0

当然,应该是这样的:

SELECT t2_second.rel_id 
FROM table1 t1 
INNER JOIN table2 t2_first ON t1.id = t2_first.rel_id 
INNER JOIN table2 t2_second ON t2_second.rel_id = t1_first.item_it 
WHERE 
    t1.url = '%/:filename' AND 
    t2_second.field_id = 42 

你可以在不同的甚至抛出这样每个t2_second.rel_id只回一次:

SELECT DISTINCT [...] 

你可能不需要这个,但是,如果t2_second.field_id = 42将限制查询仅返回每行一行t2_second.rel_id

0

这个查询对我很有用,对Ignacio的答案做了一个小改动:

SELECT url, second.rel_id AS user_id 
FROM table1 
INNER JOIN table2 AS first 
    ON table1.id=first.rel_id 
INNER JOIN table2 AS second 
    ON first.item_id=second.item_id 
WHERE second.field_id='42' 
    AND table1.url LIKE '%/:downloadfile'