Ketika saya mengatur sql berikut, dan menjalankannya. SQL tersebut telah dibaca dan disimpan dengan benar ke @myquery

SELECT CONCAT("SELECT id ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 3 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 2 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 2 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 1 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 1 DAY),"' ",
"FROM table",
"WHERE type in ('Daily') ",
"GROUP BY 1") INTO @myquery;

SELECT @myquery;

PREPARE stmt FROM @myquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Tetapi ketika pernyataan PREPARE , kesalahan berikut kembali.

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'in ('Daily') GROUP BY 1' at line 1

Apa poin yang salah dari pertanyaan ini? apakah ini tergantung pada versi servernya?

Sepertinya tidak ada masalah.

Jika seseorang memiliki pendapat, beri tahu saya

Terima kasih

1
Heisenberg 12 Mei 2021, 07:22

2 jawaban

Jawaban Terbaik

Tidak ada spasi antara nama tabel dan kata kunci WHERE:

"FROM table",
"WHERE type in ('Daily') ",

Jadi setelah fragmen digabungkan bersama, kueri Anda akan menjadi:

... FROM tableWHERE type in ('Daily') ...

MySQL akan mengira Anda memiliki tabel bernama tableWHERE, yang mungkin baik-baik saja setidaknya demi sintaks. Itu belum diperiksa untuk melihat apakah tabel ini ada.

Kemudian Anda memberinya alias tabel type, yang secara sintaksis masih oke.

Tapi kemudian alias tabel diikuti oleh in yang membingungkan MySQL. Itu bukan tempat yang tepat untuk predikat in.

Anda dapat memperbaikinya dengan cara berikut:

"FROM table ",
"WHERE type in ('Daily') ",
1
Bill Karwin 12 Mei 2021, 04:34

Coba gunakan tanda kutip tunggal dengan CONCAT, lalu lepas tanda kutip tunggal untuk literal string di dalam klausa IN. Juga, Anda hanya harus memberikan nama literal untuk alias.

SELECT CONCAT('SELECT id',
    ', COALESCE(SUM(IF(snapshot_day = DATE(NOW() - INTERVAL 3 DAY), 1, 0))) AS now_minus_3',
    ', COALESCE(SUM(IF(snapshot_day = DATE(NOW() - INTERVAL 2 DAY), 1, 0))) AS now_minus_2',
    ', COALESCE(SUM(IF(snapshot_day = DATE(NOW() - INTERVAL 1 DAY), 1, 0))) AS now_minus_1 ',
    'FROM table ',
    'WHERE type in (''Daily'') ',
    'GROUP BY 1') INTO @myquery;
1
Tim Biegeleisen 12 Mei 2021, 04:36