簡體   English   中英

將兩個MySQL查詢合並為一個

[英]Combining two MySQL queries into one

在我的數據庫中,我有兩個表:Replies和Threads。

我正在嘗試創建一個“貢獻”頁面,以顯示用戶已啟動或回復的線程。

內部答復是“ ThreadId”和“ Poster”,它們指定要答復的線程的ID,並且Threads中的每一行都有一個ID列和一個“ Poster”列。

我正在嘗試進行查詢,以獲取用戶已在其中張貼或在其中張貼的所有螺紋的行。

例:

$myUsername = "Bob";
$q = mysql_query("SELECT * FROM `Threads` WHERE `Poster`='$myUsername'
OR (another query to find if they had a row in Replies matching `ThreadId`='$tid'
AND `Poster`='$myUsername')");

謝謝

您將需要使用IN子句來指定線程ID應該在答復表中的查詢返回的那些ID中。 像這樣的事情是我正確理解您的表的結構。

SELECT * FROM Threads WHERE Poster = $myUsername OR Id IN (
SELECT ThreadId FROM Replies WHERE Poster = $myUsername
)

使用克里斯蒂娜的解決方案可能不會導致非常有效的查詢。 以下應該更好:

SELECT * 
FROM Threads t1
WHERE t1.Poster='$myUsername'
UNION
SELECT *
FROM Threads t2
INNER JOIN replies r
ON t2.id=r.thread_id
WHERE t2.Poster<>'$myUsername'
AND r.Poster='$myUsername';

然而:

1)您真的需要威脅表中的所有列嗎? 即使您這樣做,使用'*'也很麻煩

2)如果用戶做出的答復不止一個,您仍將獲得重復-但這在使用'*'時無法解決

3)如果您在兩個表中的海報上都沒有索引,則查詢仍然很慢,無論是大量數據。

我做了不同的事情。 提供的兩個查詢返回了重復項,而沒有返回,因此我決定走更長的路。

我做了什么:

1)瀏覽用戶的每個答復,並獲得線程ID

2)使用這些ID構建查詢字符串,例如“ OR Id = $ threadId或Id = $ threadId2”等

3)將查詢字符串放入線程查詢中,例如SELECT * FROM Threads WHERE Poster = $ user $ queryString2

4)解決方案。 :)

嘗試這個:

您可以使用LEFT OUTER JOIN代替IN運算符

SELECT T.* 
FROM Threads T 
LEFT OUTER JOIN Replies R ON T.Id = R.ThreadId AND R.Poster = $myUsername
WHERE T.Poster = $myUsername OR R.Id IS NOT NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM