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).