如何创建临时表以从数组中进行选择?(MySQL)

如何创建临时表以从数组中进行选择?(MySQL),mysql,sql,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=ke

我想做一个这样的查询

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');
在上面的
内部连接处
。。。我需要
从PHP中的数组中选择
,该数组看起来像<代码>$array=['keyword1'=>9,'keyword2'=>11,'keyword4'=>13]其中值是强度,键是关键字。基本上。。。我想要
内部联接
一个临时/动态表,其中包含基于该数组的
关键字
强度
字段。我不需要PHP/PDO方面的帮助,但如何在那里放置表呢?有没有一种简单的方法可以生成我可以选择的表

执行的SQL工作正常。。。它在文章中插入一行关键字:
('some article id',5,'keyword1 id')


TL;DR:我可以将
(选择5作为强度,'keyword1'作为关键字)
更改为基于数组的表吗?

您可以使用
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

另一种方法是将值插入到临时表中。然后在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

还有一种不创建表的方法。您可以在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'))

注意:在这种情况下,您需要重复
文章id
(多次绑定)

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

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

哇,这是一个多么美妙的回答啊。这正是我想要的。如果我能再问你一件事。。。第二种方法更有效吗?如果你在处理大量数据的话,情况会是这样的,对吗?我正在测试它,但是如果你能马上知道,那会节省我一些时间。没有测试,我说不出什么更快。第一种方法的开销是“巨大的”
UNION
查询。另一方面,它是一条语句,而第二个方法需要执行三条语句。每个语句都会增加开销。我想在一定数量的数据下,第二种方法会更快。但是,在为DML使用临时表时要注意风险。如果您使用复制,您应该阅读。@JohnCullen我还将在单个事务中测试准备好的语句。性能损失可能没有那么高,但代码会简单得多。