首先:
SELECT `key`, `value` FROM settings
WHERE `key` = :base_url
OR `key` = :google_analytics
OR `key` = :site_domain
这是选择多行的正确方法吗?或者,还有更好的方法?因为它不是OR
,而是所有这些......所以它听起来不对。
问题2:
这是我的查询选择具有分页的用户:
SELECT id, email, verified, level, name_surname, age, sex, profession, education, location, privacy, suspend FROM users LIMIT :start, :results
有时我想传递一组用户来返回此查询,例如array(1,2,3,4,5)
。
显然,简单地添加WHERE $array
不起作用。那我该怎么做呢?
有时候我不想传递这个id数组,那么当有id列表和没有id列表时如何在状态之间切换?我是否只是在prepare语句上创建php if else?这似乎很明显,但最好问一下最佳实践:)
答案 0 :(得分:32)
<强> 1。 where子句中的乘法值,不需要使用OR。使用in,就像查询一样。
SELECT `key`, `value` FROM settings
WHERE `key` in ( :base_url, :google_analytics, :site_domain);
<强> 2。与第一个相同。
SELECT * FROM users where id in (1,2,3,4,5);
所以如果你有一组用户id,你必须用','胶水内爆。
继承了php的一个完整例子;
<?php
$users = array(1,2,3,4,5);
$usersStr = implode(',', $users); // returns 1,2,3,4,5
$sql = "SELECT * FROM users where id in ({$userStr})";
....
答案 1 :(得分:0)
我不确定我理解all of them
的含义,但是如果你使用OR
则意味着“任何这些条件都可以成立,即使其中有多个是真的。”这与“或”的常用英语用法不同,后者将是排他性的。
如果您希望所有条件同时为真,请使用AND
。
在与查询同时与多个条件进行比较时,使用IN
而不是OR
也更简单,更高效。
A prepared statement, `WHERE .. IN(..)` query and sorting — with MySQL
基本上,即使传入标量值,也应始终拥有数组:
$values = (array)$argument;
$conditions = implode(",", array_fill(0, count($values), "?");
// assuming you're using PDO
$stmt->execute($conditions);
答案 2 :(得分:0)
对于问题1,我认为@Ronald已经给你一个参考链接;
对于问题2,我认为你可以这样做:
public function myquery($condition){
if is_string($condition){
//do something to compose the query for string
}
if is_array($condition){
//do something to compose the query for array
}
}