SQL उसी तालिका में फ़ील्ड में तालिका नई पंक्तियाँ सम्मिलित करें

Nov 25 2020

मेरे पास श्रेणियों, उप-श्रेणियों और उत्पादों का एक डेटाबेस है। कई उप-श्रेणियां और इसलिए उनके उत्पादों को मूल श्रेणियों द्वारा नहीं अपनाया गया था इसलिए मैं इसे ठीक करने के लिए एसक्यूएल का उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं कुछ मुद्दों पर आ रहा हूं।

कहा तालिका में तीन कॉलम हैं; id_category, id_product, स्थिति (वे सभी ints हैं) इस तालिका में हर बार जब कोई उत्पाद किसी श्रेणी में होता है, तो उस id_product के लिए दिए गए श्रेणियों के प्रत्येक id_product को दोहराया जाता है। चाहे वह माता-पिता हो या उप-श्रेणी।

उदाहरण के लिए, हम कह सकते हैं कि बच्चे की श्रेणी 12 है जबकि माता-पिता की संख्या 143 है

अब तक मैंने जो कोशिश की है, वह है

SELECT id_product FROM category_products WHERE id_category = 12

इससे मुझे वे उत्पाद मिलते हैं जिनकी मुझे नई पंक्तियाँ बनाने में दिलचस्पी है, लेकिन मैं INSERT स्टेटमेंट को काम करने के लिए प्रबंधित नहीं कर सकता।

दूसरे, स्थिति भी एक मुद्दा है क्योंकि मुझे अंतिम, उच्चतम संख्या का चयन करने की आवश्यकता है और प्रत्येक क्षेत्र के लिए इसमें +1 जोड़ें, क्योंकि यह श्रेणी में उत्पाद की स्थिति है।

मैं जो देख रहा हूं वह मूल रूप से है:

  1. Id_product लें जहां श्रेणी = 12
  2. प्रत्येक id_product के लिए एक पंक्ति बनाते हैं जहाँ श्रेणी 143 के बराबर होती है
  3. जहाँ श्रेणी = 143 और उस पर +1 करें, उस स्थिति में उच्चतम int लें

इसलिए हमारे पास ऐसा कुछ है:

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+

SQL आईटी के बाद से पसंद किया जाएगा

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+
| 190        | 143         | 51       |
+------------+-------------+----------+
| 191        | 143         | 52       |
+------------+-------------+----------+
| 230        | 143         | 53       |
+------------+-------------+----------+

मैंने कई अलग-अलग वाक्यविन्यास और सब कुछ करने की कोशिश की, लेकिन यह केवल मुझे हर समय त्रुटियों को वापस कर रहा है। (यह PHPMyAdmin में किया जाता है वैसे)।

जवाब

1 SlavaRozhnev Nov 25 2020 at 11:23

MySQL 8.0 या बाद में आप अगली क्वेरी का उपयोग कर सकते हैं:

INSERT IGNORE INTO products
SELECT 
    id_product,
    143 as id_category,
    (
       SELECT MAX(position) 
       FROM products
       WHERE id_category = 143
     ) + 
     (row_number() over (order by id_product)) as position
FROM products
WHERE id_category = 12;

SQLize.online से परिणाम :

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+
| 190        | 143         | 51       |
+------------+-------------+----------+
| 191        | 143         | 52       |
+------------+-------------+----------+
| 230        | 143         | 53       |
+------------+-------------+----------+