Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एसक्यूएल - कई शर्तों के साथ हर कॉलम के बीच कई शब्द प्रिंट करें

नए और बेहतर (संस्करण 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 . का पहला भाग) शर्त) जब तक पर्याप्त नहीं जोड़ा गया है (दूसरा भाग)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL पर Django में कॉलम के लिए डेटा बहुत लंबा है

  2. क्या MySQL में MEDIUMINT से बचना चाहिए?

  3. दिनांक सीमा के बीच आने वाले सभी रिकॉर्ड खोजने के लिए क्वेरी को अनुक्रमित करें

  4. पीएचपी:mysql वी mysqli वी pdo

  5. आश्रित ड्रॉपडाउन बॉक्स केकपीएचपी 3