2010-03-23 70 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'