2014-04-18 30 views
0

我對此有一段時間。我有3個用戶表。他們在不同的表中,因爲他們有不同的列,這取決於他們的用戶類型。搜索具有不同列的3個不同表格中的用戶

現在登錄到該網站我試圖選擇用戶的電子郵件和與他對應的所有其他值。根據其他用戶在這裏的一些反饋,我寫了我這樣的查詢:

$query = "SELECT id, position_id, first_name, last_name, email "; 
    $query .= "FROM pims "; 
    $query .= "WHERE email = '{$email}' "; 
    $query .= "AND hashed_password = '{$hashed_password}' "; 
    $query .= "AND com_code IS NULL "; 
    $query .= "LIMIT 1 "; 

    $query .= "UNION ALL SELECT id, district_id, position_id, first_name, last_name, email "; 
    $query .= "FROM dms "; 
    $query .= "WHERE email = '{$email}' "; 
    $query .= "AND hashed_password = '{$hashed_password}' "; 
    $query .= "AND com_code IS NULL "; 
    $query .= "LIMIT 1 "; 

    $query .= "UNION ALL SELECT * "; 
    $query .= "FROM users "; 
    $query .= "WHERE email = '{$email}' "; 
    $query .= "AND hashed_password = '{$hashed_password}' "; 
    $query .= "AND com_code IS NULL "; 
    $query .= "LIMIT 1"; 

但我得到一個「數據庫查詢失敗」消息。查詢工作正常,當我只有一個SELECT聲明,所以我知道這是這個查詢不起作用。任何想法如何解決它?

+0

做所有查詢的聯合都應該有相同數量的列。 – majidarif

+0

這種情況下的替代方法是什麼? – Mike

+0

添加了我的答案。 – majidarif

回答

1

做聯合都應該在所有查詢中具有相同數量的列。

$query = "SELECT id, 'garbage_data' AS district_id, position_id, first_name, last_name, email "; 
$query .= "FROM pims "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1 "; 

$query .= "UNION ALL "; 

$query .= "SELECT id, district_id, position_id, first_name, last_name, email "; 
$query .= "FROM dms "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1 "; 

$query .= "UNION ALL "; 

$query .= "SELECT id, district_id, position_id, first_name, last_name, email "; 
$query .= "FROM users "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1"; 

如果您有一個缺少列。您可以添加無存在的數據,如:

'garbage_data' AS district_id 

這將顯示一個字符串garbage_data這只是爲了讓列數相同。

它可以是任何東西,它甚至可以是'' AS district_id

+0

但是,如果'pims'表,例如,沒有'district_id'? – Mike

+0

@Mike更新了我的答案。 – majidarif

+0

感謝您的幫助,但它沒有奏效。我不確定我做錯了什麼。 – Mike

1

首先,聯合查詢中列的數量和類型需要相同。其次,我建議你爲此提供一個視圖,然後使用該視圖以方便使用,因爲我不認爲這是您需要這種查詢的唯一位置。

$query = "SELECT id, '' as district_id, position_id, first_name, last_name, email "; 
$query .= "FROM pims "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1 "; 

$query .= "UNION ALL SELECT id, district_id, position_id, first_name, last_name, email "; 
$query .= "FROM dms "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1 "; 

$query .= "UNION ALL SELECT id, district_id, position_id, first_name, last_name, email "; 
$query .= "FROM users "; 
$query .= "WHERE email = '{$email}' "; 
$query .= "AND hashed_password = '{$hashed_password}' "; 
$query .= "AND com_code IS NULL "; 
$query .= "LIMIT 1"; 
+0

謝謝你,Parag。你的解決方案也是正確的。 – Mike

相關問題