2010-04-21 153 views
1

有沒有辦法避免爲表「social_mcouple」添加第二個LEFT JOIN來查詢下面的social_members.m_id = social_mcouple.c_id?避免多個LEFT JOIN

$res = @mysql_query("SELECT *, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted FROM social_members 
     LEFT JOIN social_member_types ON t_id=m_type WHERE m_user='".$en['user']."'"); 
+0

提示!使用通用的日期標準;)http://en.wikipedia.org/wiki/ISO_8601 – 2010-04-21 16:49:27

+0

我不知道我關注 - 你想從另一個表的字段,但你不想將表添加到查詢? – thetaiko 2010-04-21 16:52:39

+0

我想知道是否可以在沒有LEFT JOIN的情況下添加social_mcouple我總是被告知,如果使用了錯誤的方式,左連接會降低服務器的速度。因爲從長遠來看,我已經可以添加一個沒有性能問題的第二個問題了? – acctman 2010-04-21 17:41:45

回答

2

如果總是會有對應於social_members,或者有一個對應關係,那麼你可以使用INNER JOIN你只排一個感興趣social_mcouple。如果你需要所有的社交成員,不管是否有相應的social_mcouple,那麼你將需要一個左連接。 LEFT JOIN將爲您提供social_mcouple.*設置爲NULL的所有行不匹配的行。

性能命中率將取決於數據集的大小。

編輯:添加一個示例UNION查詢。

$res = @mysql_query(" 
(SELECT social_members.*, social_member_types.*, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted, 
    NULL AS mcouple1, NULL AS mcouple2, NULL AS mcouple3 
FROM social_members 
LEFT JOIN social_member_types ON t_id=m_type 
WHERE m_user='".$en['user']."' AND m_type != 2) 

UNION 

(SELECT social_members.*, social_member_types.*, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted, 
    social_mcouple.mcouple1, social_mcouple.mcouple2, social_mcouple.mcouple3 
FROM social_members 
LEFT JOIN social_member_types ON t_id=m_type 
    JOIN social_mcouple ON social_members.m_id = social_mcouple.c_id 
WHERE m_user='".$en['user']."' AND m_type = 2) 
"); 
+0

我只需要從social_mcouple中獲取所有字段IF social_member.m_id = social_mcouple.c_id如果不是那麼social_mcouple表就不需要了。所以如果我在我的情況下正確地閱讀你的答案LEFT JOIN是我需要而不是內部聯接? – acctman 2010-04-21 19:19:35

+0

還有一種方法來寫語句幾乎像一個IF語句WHERE如果m_type = 2然後運行LEFT JOIN for social_mcouple如果不保持語句相同? – acctman 2010-04-21 19:26:10

+0

@acctman - 這是正確的。 – thetaiko 2010-04-21 19:28:06