【问题标题】:mysql selecting multiple rows that match array of idsmysql选择匹配id数组的多行
【发布时间】: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?这似乎很明显,但最好询问最佳实践:)

【问题讨论】:

标签: php mysql sql arrays


【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2016-06-01
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多