【问题标题】:How to INSERT based on a condition?如何根据条件插入?
【发布时间】:2016-06-15 22:18:29
【问题描述】:

我有这些INSERT 查询:

$db->prepare("INSERT INTO
              events (post_id, table_code, other_id, user_id, author_id, date_time )
              VALUES (?      , 15        , ?       , ?      , ?        , UNIX_TIMESTAMP()),
                     (?      , 15        , ?       , ?      , ?        , UNIX_TIMESTAMP())
")->execute(array($answer_id, $answer_id, $author_ques_id, $author_ques_id,
                  $answer_id, $answer_id, $author_ques_id, $author_ans_id));

如您所见,上面的查询将两行插入events 表中。现在我需要在第二行的路上设置一个条件。我的意思是如果 $conditiontrue 然后插入第二行,否则它不应该插入第二行。 (始终应插入第一行).

注意: $condition 总是包含一个布尔值。

那么,我怎样才能把那个条件放在第二行插入的方式上呢?

【问题讨论】:

  • 你不能再做一个准备好的陈述吗?
  • @georaldc 是的,我可以..如果我强迫我会这样做..!但我认为有一种方法可以通过一个 INSERT 查询来做到这一点。
  • 您不必用您知道的 SQL 对其进行编程,只需让您的脚本做出决定即可。您不必在 1 行代码中解决所有问题。
  • 只要少一行代码不会多花 5 行 sql...我相信总是更清晰的代码更好:-)
  • @Stack 我相信这叫做“过早的优化” ;-) 另外,我已经尝试在 SQL 中实现一些逻辑 - 相信我,它很快就会变得非常混乱......

标签: php mysql sql pdo


【解决方案1】:

您可以像这样使用insert select 语句:

$db
->prepare("INSERT INTO
             events (post_id, table_code, other_id, user_id, author_id, date_time )
             select ?, 15, ?, ?, ?, UNIX_TIMESTAMP()
              UNION ALL
             select ?, 15, ?, ?, ?, UNIX_TIMESTAMP()
               from (select 1) as a
              where 1=?
")->execute(array($answer_id, $answer_id, $author_ques_id, $author_ques_id,
                  $answer_id, $answer_id, $author_ques_id, $author_ans_id,
                  ($yourCondition?1:0) ));

【讨论】:

  • 不错...!为什么不UNION ALL ?因为UNION 试图去除重复,根本没有重复的行。
  • 这取决于您的要求,因为我不知道我使用 UNION 可以避免重复,但如果必须,您可以使用它:)
  • 很好.. +1 ..!最后一个问题,我不能直接通过$yourCondition?该变量始终包含truefalse。那么这个条件是强制性的$yourCondition==true?1:0 吗?我的意思是true/false 有什么问题?为什么要填写0/1
  • 是的,当然可以直接通过。这只是为了您的理解。由于它已经是一个布尔值,您可以将其用作$yourCondition?1:0 它是一个ternary operator
  • 好的,但是我的意思是:query: . . . where ?php: , $yourCondition)
【解决方案2】:

在 2 个查询中这样做有什么问题?

$query = $db->prepare("INSERT INTO
              events (post_id, table_code, other_id, user_id, author_id, date_time)
              VALUES (?, 15, ?, ?, ?, UNIX_TIMESTAMP())");

$query->execute(array($answer_id1, $answer_id1, $author_ques_id1, $author_ans_id1));

if ($condition)
    $query->execute(array($answer_id2, $answer_id2, $author_ques_id2, $author_ans_id2));

【讨论】:

  • 应该注意的是,我怀疑接受您的解决方案或那个解决方案。你的解决方案真的很干净。无论如何,再次感谢。
【解决方案3】:

您可以在准备和执行之前构建查询字符串和值数组。

$query = "INSERT INTO
          events (post_id, table_code, other_id, user_id, author_id, date_time )
          VALUES (?, 15, ?, ?, ?, UNIX_TIMESTAMP())";
$values = array($answer_id, $answer_id, $author_ques_id, $author_ques_id);
if ($condition) {
    $query .= ",(?, 15, ?, ?, ?, UNIX_TIMESTAMP())";
    $values = array_merge($values, array($answer_id, $answer_id, $author_ques_id, $author_ans_id);
}
$db->prepare($query)->execute($values);

【讨论】:

    【解决方案4】:

    既然 $condition 是一个 php 变量,为什么不在 PHP 中这样做:

    if ($condition === true) {
        $db->prepare($first_and_seccond_row);
    } else {
        $db->prepare($first_row);
    }
    

    【讨论】:

    • 自动更正得到 PHP 并将其变成 Photoshop? ;)
    • 该死的。愿自动更正餐厅的发明者安息
    • 对不起,我不太懂英语,我无法理解你的意思..!但我猜你在开玩笑:)(基于你评论末尾的那个表情符号)
    • 别担心,自动更正把 php 变成了 Photoshop XD,最好你一开始没有注意到
    • 我看到了,我就像 wtf :)
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2013-03-31
    • 2020-02-22
    • 1970-01-01
    • 2012-07-08
    • 2021-10-02
    相关资源
    最近更新 更多