如何创建临时表以从数组中进行 SELECT 操作?(MySQL)

jsc*_*cul 5 mysql sql

我正在尝试做这样的查询......

INSERT INTO article_keyword (article_id, keyword_id, strength)

SELECT ?, keyword.keyword_id, strength_table.strength FROM keyword

INNER JOIN (SELECT 5 AS strength, 'keyword1' AS keyword) AS strength_table
    ON strength_table.keyword=keyword.keyword

WHERE keyword IN ('keyword1', 'keyword2', 'keyword3');
Run Code Online (Sandbox Code Playgroud)

INNER JOIN上面...我需要SELECT从 PHP 中的一个数组,看起来像...$array = ['keyword1' => 9, 'keyword2' => 11, 'keyword4' => 13];其中值是强度,键是关键字。本质上...我想要INNER JOIN一个带有字段keywordstrength基于该数组的临时/动态表。我不需要 PHP/PDO 方面的帮助,但我如何在那里放置表格?有没有一种简单的方法可以生成我可以使用的表格SELECT

执行的 SQL 有效...它将一行插入到article_keyword:中('some article id', 5, 'keyword1 id')

TL;DR:我可以更改(SELECT 5 AS strength, 'keyword1' AS keyword)为基于数组的表吗?

Pau*_*gel 6

您可以使用UNION ALL在子查询中构建内联表:

INSERT INTO article_keyword (article_id, keyword_id, strength)
    SELECT ?, keyword.keyword_id, strength_table.strength
    FROM keyword
    INNER JOIN (
        SELECT  9 AS strength, 'keyword1' AS keyword
        UNION ALL
        SELECT 11 AS strength, 'keyword2' AS keyword
        UNION ALL
        SELECT 13 AS strength, 'keyword4' AS keyword
    ) AS strength_table
        ON strength_table.keyword=keyword.keyword
Run Code Online (Sandbox Code Playgroud)

数据库小提琴

另一种方法是将您的值插入到临时表中。然后在 INSERT 语句中使用该表:

CREATE TEMPORARY TABLE tmp_strength_table (strength INT, keyword VARCHAR(50));
INSERT INTO tmp_strength_table (strength, keyword) VALUES
    ( 9, 'keyword1'),
    (11, 'keyword2'),
    (13, 'keyword4');

INSERT INTO article_keyword (article_id, keyword_id, strength)
    SELECT ?, keyword.keyword_id, strength_table.strength
    FROM keyword
    INNER JOIN tmp_strength_table AS strength_table
        ON strength_table.keyword=keyword.keyword
Run Code Online (Sandbox Code Playgroud)

数据库文件

还有一种不建表的方法。您可以只在 VALUES 子句中使用子查询:

INSERT INTO article_keyword (article_id, strength, keyword_id) VALUES
  (?, 9,  (SELECT keyword_id FROM keyword WHERE keyword = 'keyword1')),
  (?, 11, (SELECT keyword_id FROM keyword WHERE keyword = 'keyword2')),
  (?, 13, (SELECT keyword_id FROM keyword WHERE keyword = 'keyword4'))
Run Code Online (Sandbox Code Playgroud)

数据库小提琴

注意:在这种情况下,您将需要重复article_id(绑定多次)。

MariaDB 10.3 和表值构造函数

表值构造函数在 MariaDB 10.3.3 中实现。我们现在可以使用VALUES语法来创建内联表:

INSERT INTO article_keyword (article_id, keyword_id, strength)
  WITH strength_table(strength, keyword) AS (
    VALUES (9, 'keyword1'), (11, 'keyword2'), (13, 'keyword4')
  )
  SELECT ?, keyword.keyword_id, strength_table.strength
  FROM keyword
  INNER JOIN strength_table AS strength_table
    ON strength_table.keyword=keyword.keyword
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴