php - 在mysql的where子句中使用未知长度的数组
问题描述
我正在编写一个 SQL 查询。我有一个长度未知的数组,我想通过在查询的 WHERE 子句中使用该数组来从 MySQL 中选择数据。这是我现在的查询,它工作正常
$sql = "SELECT DISTINCT messagesutou.SenderID from messagesutou where (messagesutou.SenderID !='$items[1]' AND messagesutou.SenderID !='$items[0]' AND messagesutou.SenderID !='$items[2]') AND messagesutou.RecieverID='$uid'";
但是在这里我知道数组(3)的长度,并且我只是使用带有索引的数组名称来进行测试。现在我想知道数组长度是否未知,那么我将如何编写这个查询?
解决方案
$list = implode(',', $items);
和
SELECT DISTINCT SenderID
FROM messagesutou
WHERE 0 = FIND_IN_SET(SenderID, '$list')
AND RecieverID='$uid'
或(取自Jens的回答,已被他删除)
SELECT DISTINCT SenderID
FROM messagesutou
WHERE SenderID NOT IN ($list)
AND RecieverID='$uid'
区别 - 当值具有数字类型时SenderID
,这两种变体都适用,只有当它们具有字符串类型时才适用,当它们具有字符串类型并包含逗号或刻度时则不适用。$items
但后者可能会被改编:
$list = '\''.implode('\',\'', $items).'\'';
和
SELECT DISTINCT SenderID
FROM messagesutou
WHERE SenderID NOT IN ($list)
AND RecieverID='$uid'
它现在接受任何数据类型并允许使用逗号(但不包括记号 - 它们必须在内爆之前被引用)。
推荐阅读
- google-apps-script - Gsuite Basic 试用版今天刚结束,但我通过 Apps Script 发送的电子邮件配额仍然是 100,这是为什么?
- unity3d - 如何在 Unity 中为赛道创建具有物理摩擦力的对撞机
- node.js - 如何在 Express 中跨模块传输登录名和密码
- python - 是否可以在 Python 3 中获取类型化类属性的 DocString?
- c# - VS gitignore 问题
- linux - 在 RHEL - 4.7 中安装 perl-LWP-Protocol-https
- ruby - 在 ruby 编程中是否对已注册的电子邮件 ID 进行任何验证检查
- c# - 在 Windows Form .Net 中使用 FtpWebRequest 下载 FTP
- c - 发送带有 MSG_ZEROCOPY 的 udp 消息时,什么会导致返回 SO_EE_CODE_ZEROCOPY_COPIED?
- c# - 如何使用 web api 确保 ssrs 安全