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数组的多行的主要内容,如果未能解决你的问题,请参考以下文章

当join匹配多行时,如何从一个表中选择行?

MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

选择多行作为数组

MySQL 根据特定字段值和行数选择多行

MYSQL 根据多行从表中选择

使用 Node.js 和 Express.js 在 MySQL 中删除给定值数组的多行