【问题标题】:INSERT INTO, Multiple WHERE IN, Check if value existINSERT INTO,多个 WHERE IN,检查值是否存在
【发布时间】:2019-09-24 11:25:43
【问题描述】:

我正在一个相对较长的多维数组中收集30个标题和内容的信息,然后通过一个MySQL查询将它们全部放入数据库。但是我的检查查询与插入是分开的。我正在通过新帖子的标题检查类似的帖子,然后将其插入。如何将检查查询与插入查询合并?

这是我的多维数组,大约 30 个帖子:

    array(
        [0] => array(
            [post_title] => $postTitle1,
            [post_content] => $contentTitle1,
        )
        [1] => array(
            [post_title] => $postTitle2,
            [post_content] => $contentTitle2,
        )
        [N] => array(
            [post_title] => $postTitleN,
            [post_content] => $contentTitleN,
        )
    );

这是我对新帖子标题的检查查询(已针对每个帖子完成并且工作正常):

SELECT post_title FROM x_post WHERE post_title=$newPostTitle

这是我的插入查询(工作正常):

INSERT INTO x_post (`post_title`, `post_content`, `date_created`, `user_id`)
                              VALUES ((((( My multidimensional array's information will be here after processing )))))


最后这是我想要的查询,但它不起作用(合并两个查询):

INSERT INTO x_post (`post_title`, `post_content`, `date_created`, `user_id`) 
SELECT * FROM (SELECT  $postTitle1, $content1,  $time, $userId") AS tmp1, (SELECT  $postTitle2, $content2,  $time, $userId") AS tmp2, .......... and so on ........... , (SELECT  $postTitle30, $content30,  $time, $userId") AS tmp30 WHERE NOT EXIST (SELECT x_post.post_title FROM x_post WHERE x_post.post_title IN ($newPostTitle1, $newPostTitle2, ... and so on... , $newPostTitleN))

编写查询的最佳方式是什么? 事实上,我想检查所有 30 个帖子是否存在相似的查询,然后插入那些不相似的。 我知道这很复杂,但会是一个很好的查询。

非常感谢。

【问题讨论】:

  • 您能解释一下检查查询的目的是什么吗?
  • @KIKOSoftware - 我想检查标题是否存在,不为该帖子执行插入。
  • 这个标题不是一个很糟糕的选择吗?如果两个“帖子”的标题相同,但内容完全不同怎么办?对于这些问题,我很抱歉,但是您对我们实际工作的内容知之甚少。通常,您会为此使用记录的某些独特功能,例如唯一 ID。
  • 好吧,好吧,无论如何,我相信最好的系统是你一直在使用的:用一个查询检查标题,从你的 $array 中删除重复项,然后用另一个查询插入剩余的帖子.其他任何事情都会变得非常难以阅读/难以管理。检查 30 个帖子并不是一场灾难,即使您有一个查询,它仍然需要做同样的工作。您还可以通过在查询的WHERE 部分中使用OR 来通过一个查询检查30 个帖子,然后从$array 中删除所有找到的标题。这样您就只需要运行 2 个查询。
  • 好吧,30 次单独的检查会比 1 次大检查稍微慢一些,但是将这些检查和插入查询结合起来,在一个大查询中不会加快速度。但是测试一下,这样你就知道了。

标签: php mysql sql


【解决方案1】:

您可以使用UNION ALL 制作一组您的个人FROM-less SELECTs,然后您可以将其用作一个派生表而不是 30 个。而不是在@987654325 中使用IN @ 子句你可以直接关联。

INSERT INTO x_post
            (`post_title`,
             `post_content`,
             `date_created`,
             `user_id`) 
            SELECT `post_title`,
                   `post_content`,
                   `date_created`,
                   `user_id`
                   FROM (SELECT $postTitle1 `post_title`,
                                $content1 `post_content`,
                                $time `date_created`,
                                $userId `user_id`
                         UNION ALL
                         ...
                         UNION ALL
                         SELECT $postTitle30 `post_title`,
                                $content30 `post_content`,
                                $time `date_created`,
                                $userId `user_id`) tmp
                   WHERE NOT EXISTS (SELECT *
                                            FROM x_news
                                            WHERE x_news.news_title = tmp.`post_title`);

【讨论】:

  • 您好@sticky-bit,我对最终查询进行了一些编辑,将“新闻”替换为“帖子”。有关系吗?
  • @AmirhosseinTarmast:嗯,当SELECT 在被语句更改的表上的语句中完成时,MySQL 可能会出现问题。但是你可以试试。只需相应地重命名我的查询,看看你得到了什么。
  • 我收到此错误:由于表 'mydatabase.tmp' 不存在而失败。我也在查询中使用了“as tmp”,但又遇到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2021-12-06
  • 2023-02-21
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多