mysql选择匹配id数组的多行
Posted
技术标签:
【中文标题】mysql选择匹配id数组的多行【英文标题】:mysql selecting multiple rows that match array of ids 【发布时间】:2013-12-26 16:34:17 【问题描述】:首先:
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 列表时切换状态?如果在准备语句中没有其他内容,我是否只需创建 php?这似乎很明显,但最好询问最佳实践:)
【问题讨论】:
你的意思是这样的:***.com/questions/3703180/… 同样适用于字符串 【参考方案1】:要从where
子句中获取多个值,无需使用OR
。使用in
,如下查询:
SELECT `key`, `value` FROM settings
WHERE `key` in ( :base_url, :google_analytics, :site_domain);
这个和第一个一样:
SELECT * FROM users where id in (1,2,3,4,5);
因此,如果您有一个用户 ID 数组,则必须使用 implode
和 ','
粘合字符。
这是一个完整的 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)";
....
【讨论】:
如果数组为空怎么办? usersStr 没有 ID?它会返回所有记录吗?还是会失败? 我的建议是在查询前检查,内爆和发送查询,if(!empty($users)) ...
因为如果数组是空的,为什么还要发送一个额外的查询呢? @salivan
确实如此。你回答了我所有的问题,谢谢! :)
太完美了。谢谢。【参考方案2】:
问题 1
我不确定我是否理解您所说的all of them
是什么意思,但如果您使用OR
,则表示“这些条件中的任何一个都可能为真,即使其中多个条件为真。”这与“或”的常见英语用法不同,后者是排他性的。
如果您希望所有条件同时为真,请使用AND
。
在查询中同时比较多个条件时,使用IN
而不是OR
也更简单、更有效。
问题 2
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);
【讨论】:
【参考方案3】:对于第一个问题,我想@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
【讨论】:
以上是关于mysql选择匹配id数组的多行的主要内容,如果未能解决你的问题,请参考以下文章