1

タイトルが示すように、テーブル 3 (list_mail_usr) にテーブル 1 (temp_urs) の列のすべての行と、テーブル 2 の 1 列の最後の行だけを挿入したいのですが、列 1 のすべての行が表示されます。 list_mail_nom テーブルの list_id 列の最後の行と同じ ID を持っています。

$tmp_usr = "INSERT INTO list_mail_usr (id_usuario,list_id)
SELECT temp_urs.id_usuario
JOIN list_mail_nom.list_id
WHERE MAX(ID) FROM list_mail_nom.list_id
";

これは私がこれまでに持っているものです。そして、それは明らかに機能していません;(何か提案はありますか?

これはほとんど機能しますが、temp_usr から各行を 65 回挿入します

$tmp_usr = "INSERT INTO list_mail_usr (id_usuario,list_id)
            SELECT temp_usr.id_usuario,list_mail_nom.list_id
            FROM temp_usr,list_mail_nom";
$insert = $asies -> query($tmp_usr) or die (mysqli_error($asies));
4

2 に答える 2

2

集計関数を正しく使用していません。やろうとしていることを実行するには、GROUP BY と HAVING を使用する必要があります。より単純なクエリは次のようになります。

INSERT INTO new_table (new_a, new_b)
SELECT x.col, y.col
FROM x, y
WHERE y.id = (SELECT MAX(id) FROM y)

大きなテーブルでは、サブクエリを最適化する MySQL の難しさが明らかになります。最大 ID を個別に見つけて定数として渡すことができれば、大きなテーブルに対してパフォーマンスが大幅に向上します (ID にインデックスがあると想定されるため、大きな y よりも大きな x の方が大きい)。

于 2012-07-17T18:42:26.947 に答える
1

MySQLに値がサブクエリから来ていることを伝える必要があります。

$tmp_usr = "INSERT INTO list_mail_usr (id_usuario,list_id)
VALUES(
SELECT temp_urs.id_usuario, some_other_field_name
JOIN list_mail_nom.list_id
WHERE MAX(ID) FROM list_mail_nom.list_id)
";

また、selectは、list_mail_usrに入力しているのと同じ数のフィールドを出力する必要があります。上記のクエリで他のフィールド名を次のように表現しましたsome_other_field_name

于 2012-07-17T16:41:49.057 に答える