नए और बेहतर (संस्करण 3 कैसे) चर का उपयोग करते हुए और मूल रूप से यहां से एक ही ट्रिक का उपयोग करते हुए :
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
आपके द्वारा दिए गए उदाहरण डेटा के लिए, यह कुछ ऐसा उत्पन्न करता है:
+--------------+-----------+
| 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 |
+--------------+-----------+
यह किसी भी आकार के परिणाम के लिए काम करना चाहिए; बस शर्त बदलें (y_of_birth = 2000
) आप जो भी स्थिति चाहते हैं। मैंने इसका परीक्षण करने के लिए MySQL 5.6 में अपग्रेड किया (यह वास्तव में एक छोटा अंतर साबित हुआ)।
मूल चाल स्थिर मूल्यों के साथ दो-पंक्ति तालिका बनाना है (इस मामले में, 1
और 0
) UNION
. का उपयोग करके और फिर LEFT JOIN
कि वास्तविक परिणामों में 2 की शक्ति तक भरने के लिए कई बार। इसका मतलब है कि हमने परिणाम में प्रत्येक पंक्ति की संख्या की गणना की है (जिसे row_num
कहा जाता है) ) ताकि हम जॉइन कंडीशन को ठीक से तैयार कर सकें। अंत में, यह हर इतनी पंक्तियों में एक डुप्लिकेट पंक्ति उत्पन्न करता है; अंतिम बिट यह है कि हम उन डुप्लीकेट्स पर जो चुनते हैं उसे बदलना है (IF
. का उपयोग करके) s) यह जाँच कर कि हम असली हैं या नकली (1
या 0
) पंक्ति।
यह एक ही टीम के खिलाड़ियों को एक दूसरे के बगल में होने से रोकना चाहिए जब तक कि यह असंभव न हो क्योंकि एक टीम में बहुत अधिक खिलाड़ी होते हैं; इसे कैसे करें, इसके बारे में अधिक जानने के लिए ऊपर दिए गए लिंक को देखें। मूल विचार यह है कि क्लब द्वारा आदेश दिया जाए और फिर उस सूची के पहले भाग और दूसरे भाग से वैकल्पिक रूप से चयन किया जाए।
अंतिम चाल यह पता लगाने की थी कि डमी पंक्तियों में कितने और कहाँ शामिल होना है। कई चीजों की कोशिश करने के बाद, मैंने महसूस किया कि यह वास्तव में बहुत आसान है:बस हर पंक्ति के साथ जुड़ें जब तक कि हम डमी पंक्तियों की वांछित संख्या तक नहीं पहुंच जाते (@extra
) हालांकि, यह परिणामों के शीर्ष पर सभी डमी पंक्तियों को पैक करेगा; उन्हें और अधिक फैलाने के लिए (पूरी तरह से फैला हुआ नहीं, बल्कि अधिक फैला हुआ), गणना करें कि हमें कितनी बार एक जोड़ने की आवश्यकता है (FLOOR(@count / @extra)
) और फिर हर एक को कई पंक्तियों में डाल दें (ON
. का पहला भाग) शर्त) जब तक पर्याप्त नहीं जोड़ा गया है (दूसरा भाग)।