![](/img/trans.png)
[英]Using an Alias on a Subquery and then doing a LEFT JOIN with it in the ON clause
[英]Using alias in LEFT JOIN
我有一張桌子,我在這里存儲友誼關系。
它具有id,userA和userB列(userA的ID始終小於userB的ID)。
我嘗試選擇特定用戶的所有友誼關系:
SELECT CASE friendships.userA WHEN (?) THEN friendships.userB ELSE friendships.userA END AS friend_id, users.username FROM friendships
LEFT JOIN users ON friend_id=users.id WHERE userA = (?) OR userB = (?) ORDER BY timestamp DESC LIMIT ? OFFSET ?;
$stmt->bind_param("iiiii", $user_id, user_id, $user_id, $requestsPerLoad_db, $offset);
我收到以下錯誤消息:
“ on子句”中的未知列“ friend_id”
這句話有什么問題? 我可以獲得$ row ['friend_id']的值,但不能在左聯接中使用它?
這是您的查詢:
SELECT (CASE f.userA WHEN (?) THEN f.userB ELSE f.userA END) AS friend_id,
u.username
FROM friendships f LEFT JOIN
users u
ON friend_id = u.id
WHERE f.userA = (?) OR f.userB = (?)
ORDER BY timestamp DESC
LIMIT ? OFFSET ?;
friend_id
是在SELECT
定義的,因此不能在同一查詢的其他地方使用。 您將必須使用子查詢。 一種簡單的解決方案是將邏輯移到ON
子句。 這是一種方法:
ON (u.id = f.userA and f.userB = ?) or
(u.id = f.userB and f.userA = ?)
另一種方法是完全跳過LEFT JOIN
並將邏輯移到WHERE
子句:
SELECT u.id, u.username
FROM users u
WHERE EXISTS (SELECT 1
FROM friendships f
WHERE f.userB = ? AND f.userA = u.id
) OR
EXISTS (SELECT 1
FROM friendships f
WHERE f.userA = ? AND f.userB = u.id
)
ORDER BY timestamp DESC
LIMIT ? OFFSET ?;
這種方法的優點是查詢可能能夠利用適當的索引。
那是因為它是派生列(或別名),而不是Friendships table
的一部分。 您不能將一個表中的兩個表連接在一起,而這兩個表都不存在。
另一種方式來獲得所有的朋友與UNION
查詢,如下圖所示(我不知道為什么join
需要為列在目前friendships
只表):
SELECT userB
FROM friendships
WHERE userA = ?
UNION
SELECT userA
FROM friendships
WHERE userB = ?
我在ON語句中添加了CASE語句,它的工作原理是:
SELECT CASE friendships.userA WHEN (?) THEN friendships.userB ELSE friendships.userA END AS friend_id, users.username FROM friendships
LEFT JOIN users ON CASE friendships.userA WHEN (?) THEN friendships.userB ELSE friendships.userA END =users.id WHERE userA = (?) OR userB = (?) ORDER BY timestamp DESC LIMIT ? OFFSET ?;
$stmt->bind_param("iiiiii", $user_id, $user_id, $user_id, $user_id, $requestsPerLoad_db, $offset);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.