2014-04-18 29 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

相关问题