MySQL SELECT WHERE IN LIST 和 NOT IN LIST 在同一 SQL 中
Posted
技术标签:
【中文标题】MySQL SELECT WHERE IN LIST 和 NOT IN LIST 在同一 SQL 中【英文标题】:MySQL SELECT WHERE IN LIST and NOT IN LIST in the same SQL 【发布时间】:2012-05-01 01:20:40 【问题描述】:我有这个:
$ids = "1,2,3,4,5";
$sqlQuery = "SELECT id, moderation_date
FROM table_live
WHERE id IN (".$ids.")";
$q = $this->CI->db->query($sqlQuery);
if($q->num_rows() > 0)
foreach ($q->result() as $row)
$arr[] = $row;
return $arr;
如果所有 id 都存在于 table_live 中,这一切正常 并返回
array([id] => 1 [moderation_date] => 2012-04-11 12:55:57)....
问题:如果我发送 1-2-3-4-5 的 id 列表,其中只有 1-2-5 匹配 IN LIST 子句 我需要返回列表中的所有内容,对于那些与列表不匹配的内容,我需要返回一个空值。
array([id] => 3 [moderation_date] => null)
【问题讨论】:
请提供示例数据和所需的输出。 如果所有不存在的id都有moderation_date
作为NULL
,你可以在分配$arr[]
时使用它
【参考方案1】:
生成一个外连接语句,以便获得:
SELECT ids.id, table_live.moderation_date
FROM (select 1 id union all select 2 union all ....) ids
LEFT JOIN table_live
ON ids.id = table_live.id
其中 ids 是枚举所有值的子查询,如下所示:
$ids = '1,2,3,4,5'
$subquery = 'select '.str_replace(',', ' id union all select ', $ids).''
$sql = "SELECT ids.id, table_live.moderation_date
FROM ($subquery) ids
LEFT JOIN table_live
ON ids.id = table_live.id"
一定要选择ids.id
,而不是table_live.id
。这样,ids 将始终显示,并且 moderation_date 只有在 table_live 中存在相应的行时才会显示。
另一种方法是保持查询不变,将结果存储在数组中,然后在 php 中合并数组,以便保留所有键,并仅在两个数组中键匹配的地方填写值.
我不太确定您使用的是哪种 db 库,所以我不知道如何获取结果集的数组,但假设您将使用字符串表示形式将行存储在 php 数组中id 作为键,日期作为值,那么这段代码应该可以解决问题:
$items = array(
'1' => NULL
, '2' => NULL
, ...
);
//note: use string keys in order to merge!!
$result = array_merge($items, $resultset);
见:http://php.net/manual/en/function.array-merge.php
【讨论】:
谢谢,罗兰。我喜欢你的方法,但我有一个 SQL 错误:'字段列表'中的未知列'ids.id' SELECT ids.id, table_live.moderation_date FROM (SELECT 1-2-4-5-11-26-31) ids LEFT JOIN table_live ON ids.id = table_live.id $ids 是字符串而不是表 对,问题是生成的子查询没有列别名。现已修复。 你是个天才。非常感谢! 只是一个小问题:如果 ids 字符串只有一个值,str_replace 将不起作用,因此会破坏 SQL 查询 解决方法:$pos = strpos($ids, ','); if ($pos === false) $subQuery = "SELECT ".$ids." id "; else $subQuery = "SELECT ".str_replace('-', ' id UNION ALL SELECT ', $ids).""; 谢谢以上是关于MySQL SELECT WHERE IN LIST 和 NOT IN LIST 在同一 SQL 中的主要内容,如果未能解决你的问题,请参考以下文章
使用 MySQLdb 执行“SELECT ... WHERE ... IN ...”