微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MYSQL php:如果找不到“WHERE IN”id,则查询多行并返回值

我正在开发一个管理事件的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.如果另外要删除空条目而不更改数组中的索引(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 举报,一经查实,本站将立刻删除。

相关推荐