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

SQL - cetak banyak kata di antara setiap kolom dengan banyak kondisi

Baru dan lebih baik (versi 3 caranya) menggunakan variabel dan pada dasarnya menggunakan trik yang sama dari di sini :

SELECT
  IF(is_real, '**ANY WORD**', full_name) AS full_name,
  IF(is_real, '', club_name) AS club_name
FROM
  (
    SELECT
      full_name,
      club_name,
      (@row_num2:= @row_num2 + 1) AS row_num
    FROM
      (
        SELECT p3.*
        FROM
          (
        SELECT
          p2.*,
          (@row_num := @row_num + 1) AS row_num
        FROM
          (
            SELECT *
            FROM players AS p1
            WHERE y_of_birth = 2000
          ) AS p2
        CROSS JOIN
          (
            SELECT
              @row_num := 0,
              @count := (SELECT COUNT(*) FROM players WHERE y_of_birth = 2000)
          ) AS vars
        ORDER BY club_name
      ) AS p3
    ORDER BY row_num % FLOOR(@row_num / 2), row_num
  ) AS p4
CROSS JOIN
  (
    SELECT
      @row_num2 := -1,
      @extra := GREATEST(2, POW(2, CEIL(LOG2(@count)))) - @count) AS vars
  ) AS data
LEFT JOIN
  (
    (SELECT 1 AS is_real)
    UNION ALL
    (SELECT 0 AS is_real)
  ) AS filler
ON
  MOD(row_num, FLOOR(@count / @extra)) = 0 AND
  row_num / FLOOR(@count / @extra) < @extra
ORDER BY row_num, is_real

Untuk contoh data yang Anda berikan, ini menghasilkan sesuatu seperti:

+--------------+-----------+
| full_name    | club_name |
+--------------+-----------+
| Ahmed Sayed  | El Ahly   |
| **ANY WORD** |           |
| Mohamed gad  | Ismaily   |
| **ANY WORD** |           |
| omar galal   | Cocorico  |
| **ANY WORD** |           |
| Kareem Gaber | El Ahly   |
| Kamal saber  | wadi dgla |
+--------------+-----------+

Ini harus bekerja untuk hasil ukuran apa pun; ubah saja kondisinya (y_of_birth = 2000 ) menjadi kondisi apa pun yang Anda inginkan. Saya memutakhirkan ke MySQL 5.6 untuk menguji ini (sebenarnya ternyata membuat perbedaan kecil).

Trik dasarnya adalah membuat tabel dua baris dengan nilai statis (dalam hal ini, 1 dan 0 ) menggunakan UNION lalu LEFT JOIN bahwa ke dalam hasil aktual beberapa kali untuk mengisi hingga kekuatan 2. Ini berarti kita telah menghitung jumlah setiap baris dalam hasil (disebut row_num ) sehingga kita dapat merumuskan kondisi join dengan benar. Pada akhirnya, ini menghasilkan baris duplikat setiap begitu banyak baris; bit terakhir adalah mengubah apa yang kita pilih pada duplikat tersebut (menggunakan IF s) dengan memeriksa apakah kami asli atau palsu (1 atau 0 ) baris.

Ini akan mencegah pemain dari tim yang sama bersebelahan kecuali ini tidak mungkin karena satu tim memiliki terlalu banyak pemain; lihat tautan di atas untuk mengetahui lebih lanjut tentang cara melakukannya. Ide dasarnya adalah memesan berdasarkan klub dan kemudian memilih secara bergantian dari babak pertama dan paruh kedua dari daftar itu.

Trik terakhir adalah mencari tahu berapa banyak dan di mana harus bergabung dalam baris dummy. Setelah mencoba beberapa hal, saya menyadari bahwa ini sebenarnya sangat mudah:gabung saja dengan setiap baris sampai kami mencapai jumlah baris dummy yang diinginkan (@extra ). Namun, itu akan mengemas semua baris dummy di bagian atas hasil; untuk menyebarkannya lebih banyak (tidak menyebar sempurna, tetapi lebih menyebar), hitung seberapa sering kita perlu menambahkannya (FLOOR(@count / @extra) ) dan kemudian letakkan satu setiap banyak baris (bagian pertama dari ON kondisi) sampai cukup telah ditambahkan (bagian kedua).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan nilai ibrani ke dalam db mysql di php

  2. pencarian teks lengkap php mysql:lucene, sphinx, atau?

  3. PYTHON:Perbarui GANDA KOLOM dengan variabel python

  4. MySQL, beberapa baris untuk memisahkan bidang

  5. Bagaimana cara mengisi celah tanggal di MySQL?