2015-12-02 28 views
1

我有不同的用戶角色,買家和賣家。他們的信息存儲在哪裏取決於他們的角色。因此,買家信息將被存儲在買家表中,賣家在賣家表中。用戶角色也保存在時事通訊表中。是否可以在同一查詢中使用另一個表中的值?

每個表都有一個名爲join_id的公共列,這是來自成員表的成員身份標識。

所以,現在我的問題是有可能寫沿此線的東西...

$sql = "SELECT newsletter.email, newsletter.role as role, role.first_name 
     FROM newsletter INNER JOIN role ON newsletter.join_id = role.join_id 
     WHERE newsletter.active = 1"; 
+0

花了我一段時間瞭解你的問題,但我現在看到它。你有一個買家表和一個賣家表。然後你的'通訊'表有一個列'角色',它包含一個字符串,無論是「買方」還是「賣方」,那麼你需要根據字符串''買方'或' newsletter.role'字段包含該特定成員。啊。 – Ultimater

+0

請不要編輯我的文章,你做到了,所以有人剛剛學習就不知道你在說什麼。現在,初學者很容易跟蹤。 – user3154948

+0

我非常不同意,因爲你瞭解自己的情況可能很清楚,但對任何旁觀者來說,他們看到的只是一個查詢,它不能解釋它應該做什麼,以及整個問題的錯誤語法它很難遵循,並且查詢甚至不適合1頁,因爲它全部在1行上。我的編輯幫助了在stackoverflow上使用問題的質量,但如果您想討論它,請閱讀:http://stackoverflow.com/help/how-to-ask我們已經在此建立策略。如果你不想讓我編輯你的問題,那還不清楚,那爲什麼要回答呢? – Ultimater

回答

1

我會寫像這樣的查詢:

SELECT newsletter.email, newsletter.role, 
IF(newsletter.role='buyer' AND buyers.join_id IS NOT NULL,buyers.first_name, 
    IF(newsletter.role='seller' AND sellers.join_id IS NOT NULL,sellers.first_name, 
    'Not Found') 
) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 

的想法是使用LEFT JOIN而不是INNER JOIN,所以我們包含NULL數據,然後我們加入buyers表和sellers表。加入後,我們使用if語句根據用戶在時事通訊日誌中的角色選擇我們想要的內容。

編輯:

如果你不希望看到「未找到」喜歡在上面,你可以跳過其中newsletter.join_id不匹配的買家或賣家的記錄條目。但是,那麼你不會看到特定日誌的通訊。你會通過調整WHERE做到這一點:以上

SELECT newsletter.email, newsletter.role, 
IF(newsletter.role='buyer',buyers.first_name,sellers.first_name) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 AND (
    (newsletter.role='buyer' AND buyers.join_id IS NOT NULL) 
    OR 
    (newsletter.role='seller' AND sellers.join_id IS NOT NULL) 
) 

可能是比較容易的工作,特別是如果你需要從不是買方/賣方表中選擇多個列。

編輯2:

有關管理的情況下,你只需要添加OR newsletter.role='admin'的條件,那麼它會尋找在賣家表您的信息。或者,你可以硬編碼你的名字信息if語句:

SELECT newsletter.email, newsletter.role, (
CASE newsletter.role 
WHEN 'buyer' THEN buyers.first_name 
WHEN 'seller' THEN sellers.first_name 
WHEN 'admin' THEN 'Hard-code your name here' 
ELSE 'unknown' END 
) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 AND (
    (newsletter.role='buyer' AND buyers.join_id IS NOT NULL) 
    OR 
    (newsletter.role='seller' AND sellers.join_id IS NOT NULL) 
    OR newsletter.role='admin' 
) 
+0

應該只有一個未找到的案例...這是我自己的個人登錄,因爲我的角色是「管理員」。如果有我有更大的問題!大聲笑和我的會員資格不記錄任何地方,但會員表。所有用戶都被記錄爲買方或賣方,並且通過3步註冊過程多次檢查.... – user3154948

+0

對於管理角色的情況,如果您想將自己包含在結果中, d將'OR newsletter.role ='admin''添加到WHERE。但是,由於if語句的寫法,它會在賣家表中尋找你。所以如果你想爲你的角色使用硬編碼的值,你也可以調整它。你可以創建一個「管理」表,如果你要有多個管理員帳號,那麼還需要'LEFT JOIN',這樣你的if語句就會變得更復雜。如果SQL變得太複雜,可以避免JOINS,只從PHP單獨查詢。 – Ultimater

+0

爲此,我是寫新聞通訊的人,所以我不關心接收它。至於有多個管理員,這是一個很大的不行!我的控制自然永遠不會允許。大聲笑我把它作爲2個單獨的查詢,但它所在的新服務器沒有啓用mysqlnd,並將所有內容都放入swiftmailer可接受的關聯數組中,這是一個BIG pia問題。因此,將所有內容組合成一個大查詢是唯一合理簡單的答案。 – user3154948

相關問題