[英]mysql - convert this INNER JOIN to UNION
我無法使它正常工作。 我想將此查詢轉換為UNION,以刪除OR notifies
的INNER JOIN。
SELECT posts.status, posts.reports, posts.private_id,
enter code hereposts.parent_id, posts.post_id,
posts.reply_counts, posts.sender, posts.content,
posts.image, posts.thumb, posts.date,members.username,
members.avatar,members.avatar_path,members.level, members.state
FROM posts
INNER JOIN members ON posts.sender = members.member_id
INNER JOIN notifies ON (
posts.post_id=notifies.post_id OR posts.parent_id=notifies.post_id
)
WHERE (posts.date>notifies.last_date AND posts.sender<>1)
AND notifies.member_id=1
AND posts.private_id<>0
AND posts.status=1
AND posts.reports<3
ORDER BY posts.last_update DESC, posts.date DESC LIMIT 0,25;
我的嘗試不起作用:
(SELECT posts.status, posts.reports, posts.private_id , posts.parent_id,
posts.post_id, posts.reply_counts, posts.sender, posts.content,
posts.image, posts.thumb, posts.date, members.username, members.avatar,
members.avatar_path,members.level, members.state
FROM posts
INNER JOIN members ON posts.sender = members.member_id
INNER JOIN notifies ON posts.parent_id=notifies.post_id)
UNION
(SELECT posts.status, posts.reports, posts.private_id , posts.parent_id,
posts.post_id, posts.reply_counts, posts.sender, posts.content,
posts.image, posts.thumb, posts.date, members.username, members.avatar,
members.avatar_path,members.level, members.state
FROM posts
INNER JOIN members ON posts.sender = members.member_id
INNER JOIN notifies ON posts.post_id=notifies.post_id)
WHERE (posts.date>notifies.last_date AND posts.sender<>1)
AND notifies.member_id=1
AND posts.private_id<>0
AND posts.status=1
AND posts.reports<3
ORDER BY posts.last_update DESC, posts.date DESC LIMIT 0,25;
似乎您只是將where子句添加到了UNION的最后一部分,而不是兩者都添加了。
所以你從
SELECT *
FROM A INNER JOIN
B ON (a.ID = b.ID OR a.ID = b.ID2)
WHERE tada
至
SELECT *
FROM A INNER JOIN
B ON (a.ID = b.ID)
UNION
SELECT *
FROM A INNER JOIN
B ON (a.ID = b.ID2)
WHERE tada
所以你需要做類似的事情
SELECT *
FROM A INNER JOIN
B ON (a.ID = b.ID)
WHERE tada
UNION
SELECT *
FROM A INNER JOIN
B ON (a.ID = b.ID2)
WHERE tada
您不必將其更改為union
以提高效率。 這是替代版本(僅顯示from
和where
子句):
FROM posts
INNER JOIN members
ON posts.sender = members.member_id
LEFT JOIN notifies n
ON ( posts.post_id = n.post_id )
LEFT JOIN notifies np
ON ( posts.parent_id = np.post_id )
WHERE ( (posts.date > n.last_date or posts.date > np.last_date)) AND posts.sender <> 1 )
AND (n.member_id = 1 or np.member_id = 1)
AND posts.private_id <> 0
AND posts.status = 1
AND posts.reports < 3
當父級和帖子都匹配時,這也會刪除重復的行。
我不認為日期比較確實可以滿足您的要求,但是應該很接近。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.