2017-01-28 42 views
0

MySQL的“加入”与“限制”

我用DB类使用query方法绑定在一个字符串值解决一起使用时,从只有一个表取出数据。大致看起来像这样:

public function query($sql,$params = array()) { 
    ... 
    $x = 0; 
    foreach($params as $param) { 
     $this->_query->bindValue($x, $param) 
     $x++; 
    } 
    ... 
    //Fetch Results.... 
} 

首先我使用这个字符串传递给query方法;

SELECT * FROM user_info u JOIN users us ON u.user_id = us.user_id 
WHERE u.branch IN (?) AND us.status IN (?) AND us.email_activation IN (?) 
ORDER BY ? ? LIMIT ?,? 

然后我切换到跟随字符串

SELECT * FROM user_info u JOIN users us ON u.user_id = us.user_id 
WHERE u.branch IN (?) AND us.status IN (?) AND us.email_activation IN (?) 
ORDER BY u.user_id ASC LIMIT 0,5 

然后以某种方式工作。可能它(query方法)试图将值绑定为字符串或不适用于LIMIT子句的其他类型。


问题

我试图实现哪些用户可以使用一堆条件以缩小结果的搜索功能。我有两个不同的表(用户,user_info)在我的数据库中。他们有一个共同的名字是'user_id'。 在users表中存储了用户的状态(例如,电子邮件是否有效,管理员是否接受注册等)。在user_info表中存储了用户的个人信息。

USER_INFO表

user_info table

用户表

users table

为了减少我收集过滤器的应用长话短说,并创建一个查询字符串象下面这样:

SELECT u.*, us.* 
FROM user_info u 
LEFT JOIN users us ON u.user_id = us.user_id 
WHERE u.branch IN (?) AND u.state IN (?) AND u.city IN (?) 
AND us.status IN (?) AND us.email_activation IN (?) 
ORDER BY ? ? 
LIMIT ?,? 

使用上述查询结果仅返回users中满足users列(email_activation和status)条件的行。无论我为'user_info'列指定什么条件。

但是,如果我重新排列像下面的一个字符串(删除LIMIT),我得到我想要的。两个表的条​​件都满足了。

SELECT u.*, us.* 
FROM user_info u 
LEFT JOIN users us ON u.user_id = us.user_id 
WHERE u.branch IN (?) AND u.state IN (?) AND u.city IN (?) 
AND us.status IN (?) AND us.email_activation IN (?) 
ORDER BY ? ? 

结果,

 **Without LIMIT** 
     [id] => 15 
     [user_id] => 11 
     [branch] => 4 
     [date_of_birth] => .. 
     [location] => .. 
     [city] => .. 
     [state] => .. 
     [weight] => .. 
     [height] => .. 
     [bio] => .. 
     ... 
     [name] => .. 
     [lastname] => .. 
     [mail] => .. 
     [password] => .. 
     [salt] => .. 
     [joined] => .. 
     [authority] => .. 
     [status] => 1 
     [email_activation] => 1 

     **With LIMIT (no column from the user_info table)** 
     [user_id] => 11 
     [name] => 
     [lastname] => 
     [mail] => 
     [password] => 
     [salt] => 
     [joined] => 
     [authority] => 1 
     [status] => 1 
     [activation_code] => 
     [email_activation] => 1 

编辑: 不限制的结果,我通常会得到2行。 对于LIMIT子句我使用的值: OFFSET 0,LIMIT 1 ---> LIMIT 0,1

表样品和结果样品加入

DB类使用该行的代码以结合值 $ this - > _ query-> bindValue($ x,$ param);

与实际值的查询看起来像这样

SELECT u.*, us.* 
FROM user_info u 
LEFT JOIN users us ON u.user_id = us.user_id 
WHERE u.branch IN (4) AND u.state IN (1) AND u.city IN (1) 
AND us.status IN (1) AND us.email_activation IN (1) 
ORDER BY user_id ASC 
+2

有多少限制..?可能是您的排序结果的结果是减去查看其他结果的限制.. ... limit只定义您返回的行数选择对筛选器没有影响.. – scaisEdge

+0

请参阅http://meta.stackoverflow。 com/questions/333952/why-should-i-provide-an-mcve-for-what-seem-to-what-seem-a-very-simple-sql-query – Strawberry

+0

@scaisEdge如果我省略了LIMIT '我得到2个结果。因此,我使用LIMIT 1,0 – Zeki

回答

0

你得到它周围的其他方法。 OFFSET 0,LIMIT 1 ---> LIMIT 0,1

+0

显然我在原始问题中犯了一个错字。我正在使用你推荐的方式。 – Zeki

+1

@Zeki在没有LIMIT的查询结果中,我看不到'city'或'state'。 – Aboelseoud

+0

我砍掉了结果数组的一些元素来缩短问题。我应该改正这一点。 – Zeki