gpt4 book ai didi

php - MySQL PHP : query multiple rows and return value if "WHERE IN" id not found

转载 作者:可可西里 更新时间:2023-11-01 07:34:21 25 4
gpt4 key购买 nike

我正在 wordpress 上开发一个管理事件的网站。

问题是我需要在单个查询中从相应的 ID 中获取一些事件标题名称。我正在尝试从单个 MYSQL 查询中获取多行,使用“WHERE IN ({$IDs})”可以正常工作:

$events_implode = implode(',',$events);
$events_titles = $wpdb->get_results("SELECT `title` FROM `wp_events` WHERE `id` in ({$events_implode}) ORDER BY FIELD(id,{$events_implode}",ARRAY_A);

但是,如果在查询中未找到 $ID 之一而不是不返回任何内容,我需要它返回一个值/字符串。

例子:如果 $events_implode 类似于:318,185,180,377,并且 ID 为 180 和 185 的事件不存在(例如被删除),我会取回 318 和 377 的事件标题仅:

Array
(
[0] => Array
(
[title] => Title 1
)

[1] => Array
(
[title] => Title 4
)

)

虽然我需要它返回类似的东西:

Array
(
[0] => Array
(
[title] => Title 1
)

[3] => Array
(
[title] => Title 4
)

)

我试过 IFNULL:

$events_titles = $wpdb->get_results("SELECT IFNULL( (SELECT `title` FROM `wp_events` WHERE `id` in ({$events_implode}) ORDER BY FIELD(id,{$events_implode}) ),'not found')",ARRAY_A);

但由于查询返回多行,我收到错误消息:

"mysqli_query(): (21000/1242): Subquery returns more than 1 row"

有解决办法吗?非常感谢!

最佳答案

您还可以通过查询 ID 而不仅仅是标题来实现此目的:

SELECT id, title FROM ... etc

然后您的结果数组将如下所示(对于示例数据)

array(
0 => array("id" => 318, "title" => "title for 318"),
1 => array("id" => 377, "title" => "title for 377")
)

但这可以转换为您需要的,借助您已有的$events 数组:

foreach($event_titles as $row) {
$hash[array_search($row['id'], $events)] = $row['title'];
};

$events_titles = $hash;

现在数组看起来像这样(对于示例数据):

array(
0 => array("title" => "title for 318"),
3 => array("title" => "title for 377")
)

注意:该转换也可以在没有显式循环的情况下完成:

$ids = array_intersect($events, array_column($event_titles, 'id'));
$event_titles = array_combine(array_keys($ids), array_column($event_titles, 'title'));

备选

以上可能是适合您情况的最佳解决方案,但您也可以动态构建查询来实现此目的:

$subsql = implode(
' UNION ALL ',
array_map(function ($event) { return "SELECT $event AS id"; }, $events)
);

$sql = "SELECT wp_events.title
FROM ($subsql) AS eid
LEFT JOIN wp_events ON wp_events.id = eid.id
ORDER BY eid.id";

$events_titles = $wpdb->get_results($sql, ARRAY_A);

$subsql 的值将是这样的(例如数据):

SELECT 318 AS id UNION ALL
SELECT 185 AS id UNION ALL
SELECT 180 AS id UNION ALL
SELECT 377 AS id

$events_titles 的值将是一个数组,每个事件都有一个条目,无论它是否匹配。因此,对于您给出的示例,您将得到以下结果:

array(
0 => array("title" => "title for 318"),
1 => array("title" => null), // because no match with 185
2 => array("title" => null), // because no match with 180
3 => array("title" => "title for 377")
)

因此您现在可以只测试null。如果您还想删除 null 条目而不更改数组中的索引 (0 ... 3),请执行以下操作:

$event_titles = array_filter($event_titles, function ($title) { return $title; });

这会给你(在例子中):

array(
0 => array("title" => "title for 318"),
3 => array("title" => "title for 377")
)

关于php - MySQL PHP : query multiple rows and return value if "WHERE IN" id not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38549560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com