2011-08-08 67 views
0

我在Mysql中使用php。 我想知道查詢內部查詢真的有什麼問題,如果我對使用INNER JOIN不太舒服,寧願寫多個查詢。 我在做一些非常錯誤的事,還是隻是爲了讓它看起來很健康?查詢中查詢

我的意思是......

$query="SELECT * FROM TABLE WHERE USER_ID=1"; 
$data=mysqli_query($dbc,$query); 
$row=mysqli_fetch_array($data); 
$query2="select * from TAble2 where some_id='{$row['user_id']}'"; 
$data1=mysqli_query($dbc,$query); 
$row1=mysqli_fetch_array($data1); 
// and then use $row1['column_name'] 
+1

你的意思是「子查詢」嗎?在大多數情況下,子查詢性能非常糟糕,可以使用其他方式編寫相同(或等效)的查詢。你在做什麼(郵編)? – Phil

+0

當IN子句查詢返回大量結果時,子查詢的性能更差 – Raptor

+0

@Shivan子查詢一般性能較差。對於你所說的情況,一個'EXISTS'子句通常比'IN'好。 – Phil

回答

0

主要好處儘可能地組合成一個單一查詢與迭代嵌套遊標不同的是,到數據庫的往返行程相對較爲昂貴。

使用在你的問題中嵌套遊標的方法,你是準備和執行N + 1 SQL語句,其中ñ是在初始結果集的記錄數。

如果要將這些查詢與連接組合在一起,只需準備和執行一條語句,無論結果集有多大。

SELECT T1.foo, T1.bar, T2.baz 
FROM `TABLE` T1 
INNER JOIN `Table2` T2 ON T1.user_id = T2.some_id 
WHERE T1.user_id = 1 

您也將更少的負載放在數據庫本身上,特別是啓用了語句高速緩存的地方。

4

您應該發佈一些代碼之前,我們可以幫助您與您的特定問題。

但是,我會說,做某事不舒服通常不是沒有做的藉口。相反,你應該閱讀所有你可以關於JOIN s,這樣你的舒服,然後就不會有問題。

JOIN s是非常強大的,並且有許多事情你不能在沒有它們的情況下在MySQL中完成。當您在查詢中說查詢,我假定你的意思做一些像

SELECT 
    postid 
FROM 
    Post 
WHERE 
    userid IN (
     SELECT 
     userid 
     FROM 
     User 
     WHERE 
     username = ? 
    ) 

這不是要複雜得多

SELECT 
    postid 
FROM 
    Post 
    NATURAL JOIN User 
WHERE 
    username = ? 
+0

不同意。我知道JOIN更強大,但對我來說,子查詢比那些INNER JOIN,LEFT JOIN,RIGHT JOIN,OUTER JOIN,NATURAL JOIN等更容易理解。 – Raptor

+3

@Shivan顯然你沒有很好地閱讀我的答案。你需要閱讀這些JOIN,直到你對它們感到滿意爲止,因爲它們非常強大。至少有四種不同類型的JOIN,你是否真的感到害怕?順便說一句,MySQL中的NATURAL JOIN是一個內部連接。右和左連接都是外連接。沒有真正的理由使用正確的連接。這已經擦掉了你的兩個清單! –

+2

@Shivan這不是使用「更強大」選項的情況,而是正確使用DBMS – Phil