Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana mungkin sub-grup memiliki kolom kenaikan yang dihasilkan ditambahkan dalam kueri sql?

Saya telah menyelesaikannya, terima kasih atas bantuan dari posting blog paling bagus di sini:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

Solusinya tidak sepele, membutuhkan variabel dan beberapa pengetahuan lanjutan tentang bagaimana mysql memerintahkan operasi kuerinya, tetapi tampaknya cukup berkinerja. Salah satu kuncinya adalah bahwa penetapan variabel dapat disembunyikan di dalam panggilan fungsi!

Pada dasarnya, kueri berikut memecahkan masalah:

SET @num := 0, @type := '';

SELECT name, subgroup, @num AS increment
FROM table_name
WHERE 0 <= GREATEST(
   @num := IF(@type = subgroup, @num + 1, 1),
   LEAST(0, LENGTH(@type := subgroup)))

Fungsi GREATEST , LEAST , dan LENGTH hanya ada sebagai wadah untuk penugasan variabel. Seperti yang Anda lihat, fungsi-fungsi tersebut pada dasarnya tidak melakukan apa pun untuk memengaruhi output kueri.

Namun, saya juga menemukan bahwa saya memiliki nilai "subgrup" di tabel saya yang tidak berurutan. Misalnya:

+------+----------+
| name | subgroup |
+------+----------+
| john | 1        |
| doe  | 1        |
| jim  | 1        |
| greg | 2        |
| boe  | 2        |
| amos | 3        |
| ben  | 1        |
| gary | 2        |
+------+----------+

Menghasilkan tabel output seperti ini:

+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1        |         1 |
| doe  | 1        |         2 |
| jim  | 1        |         3 |
| greg | 2        |         1 |
| boe  | 2        |         2 |
| amos | 3        |         1 |
| ben  | 1        |         1 |
| gary | 2        |         1 |
+------+----------+-----------+

Menempel ORDER BY klausa ke akhir kueri tidak berfungsi karena perintah eksekusi, dan menyembunyikan penetapan variabel di ORDER BY klausa datang lebih dekat tetapi memiliki masalah sendiri, jadi inilah kueri terakhir yang saya gunakan:

SET @num := 0, @type := '';

SELECT name, subgroup, @num AS increment
FROM (SELECT * FROM table_name ORDER BY subgroup) AS table_name2
WHERE 0 <= GREATEST(
   @num := IF(@type = subgroup, @num + 1, 1),
   LEAST(0, LENGTH(@type := subgroup)))

Menghasilkan output berikut:

+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1        |         1 |
| doe  | 1        |         2 |
| jim  | 1        |         3 |
| ben  | 1        |         4 |
| greg | 2        |         1 |
| boe  | 2        |         2 |
| gary | 2        |         3 |
| amos | 3        |         1 |
+------+----------+-----------+

Ya!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang

  2. SQL ORDER BY menggunakan pernyataan yang disiapkan

  3. Kembali tidak ada catatan di tabel

  4. Haruskah kunci utama selalu ditambahkan ke tabel innodb?

  5. MySQL Store Image BLOB Kinerja Praktik Buruk