簡體   English   中英

在LEFT JOIN中使用別名

[英]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.

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