我正在开发一个管理事件的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"
有解决方案吗?
非常感谢!
解决方法:
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.如果另外要删除空条目而不更改数组中的索引(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")
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。