विभिन्न BETWEEN खंडों के साथ एसक्यूएल क्वेरी - mysql

मान लें कि मेरे पास कंपनियों की एक तालिका है। (आईडी, नाम, ..., एकाधिक आईपी-श्रेणी)

प्रत्येक कंपनी में कुछ आईपी-श्रेणियां होती हैं (आईपी-श्रेणियों की अलग-अलग गणना)

कुछ कंपनियों में केवल दो आईपी-श्रेणियां हो सकती हैं, 1.1.1.1-2.2.2.2, 3.3.3.3-4.4.4.4 कहें

अन्य कंपनियों में अधिक आईपी-श्रेणी हो सकती हैं। (1.1.1.1-2.2.2.2,3.3.3.3-4.4.4.4.5.5.5.5-6.6.6.6 ...)

मैंने आईपी-रेंज के लिए एक और टेबल माना है। (एक से कई संबंध)।

समस्या यह है कि, एक मनमाना आईपी दिया जाता है, और मुझे कंपनियों को मिलना चाहिए, जो आईपी को उनके आईपी-रेंज से संबंधित है।

मैं उसे कैसे कर सकता हूँ?

अगर हमारे पास केवल दो आईपी-श्रेणियों के लिए है (से_1, to_1, से_2, to_2, हम लिख सकते हैं WHERE (x BETWEEN from_1 AND to_1) OR (x BETWEEN from_2 AND to_2)। लेकिन हमारे पास वैरिएंट आईपी-रेंज हैं।कुछ कंपनियों में 3 या 4 आईपी-श्रेणियां हो सकती हैं। एक तरीका है कि 10 आईपी-श्रेणियों के लिए 20 कॉलम बनाएं। से_1, to_1, से_2, to_2 ,_3 से ,_3 तक ... क्या कोई और तरीका है? क्या होगा यदि कुछ कंपनी के पास 10 से अधिक आईपी-रेंज हैं?

उत्तर:

जवाब के लिए 0 № 1

एक सामान्य आईपी एबीसीडी है जिसमें प्रत्येक ए, बी, सी, डी 1 बाइट इंट नंबर होता है जिसमें 0 से 255 का मान होता है, इसलिए आप 256 के आधार पर एक आईपी को चार-अंकीय संख्या के रूप में देख सकते हैं। इसे इसे परिवर्तित करने दें पूर्णांक:

A*255^3 + B*255^2 + C*255 + D

आईपी ​​रेंज के int मानों को डीबी (2 कॉलम, FROM और TO) में सहेजें, उदाहरण 1.1.1.1 - 2.2.2.2 की सीमा के साथ, आप सहेजते हैं:

FROM = 1*255^3 + 1*255^2 + 1*255 + 1 = 16646656

TO = 2*255^3 + 2*255^2 + 2*255 + 1 = 33293312

अब आईपी देने के साथ, इसे ऊपर की तरह पूर्णांक में भी परिवर्तित करें (मान लीजिए कि int मान x है), और क्वेरी:

SELECT Name FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
WHERE x BETWEEN `FROM` AND `TO`

उदाहरण:

कंपनी तालिका

--------------------
| Id | Name        |
--------------------
| 1  | Google      |
--------------------
| 2  | Microsoft   |
--------------------

आईपी तालिका

----------------------------------------
| Id | CompanyId | From     | To       |
----------------------------------------
| 1  | 1         | 16646656 | 33293312 |
----------------------------------------
| 2  | 1         | 11235468 | 15612545 |

उदाहरण के लिए, दिया गया आईपी 17654343 है,

  SELECT * FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
WHERE 17654343 BETWEEN `FROM` AND `TO`

परिणाम:

Google

संबंधित सवाल
सबसे लोकप्रिय