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

MYSQL - एकाधिक तालिका के संदर्भ में एक स्तंभ

एक बहुत देर से उत्तर, लेकिन जो कोई सोच रहा है और गुगल कर रहा है उसके लिए।

हां यह किया जा सकता है, लेकिन यह नहीं है अच्छा अभ्यास और हालांकि यह काफी सरल है, यह संभवत:आपके चेहरे पर खिल जाएगा यदि आप इस बारे में बहुत जागरूक नहीं हैं कि आप क्या कर रहे हैं। अनुशंसित नहीं है।

हालाँकि, मैं उपयोग देख सकता हूँ। उदाहरण के लिए, आपके पास लाखों रिकॉर्ड की एक बड़ी तालिका है, और आप असाधारण मामलों में अज्ञात या एकाधिक तालिकाओं से लिंक करना चाहते हैं (इस मामले में यह बेहतर होगा कई ) एकाधिक तालिकाओं के साथ, यदि आप उन सभी के लिए एक विदेशी कुंजी बनाते हैं, तो यह आपके डेटाबेस आकार में एक बड़ी ब्लोट होगी। उदाहरण के लिए एक तकनीकी सहायता प्रणाली में एक अज्ञात तालिका संभव होगी, जहां आप किसी तालिका में रिकॉर्ड करने के लिए लिंक करना चाहते हैं जहां कोई समस्या हो सकती है, और यह भविष्य में सहित डेटाबेस में (लगभग) सभी तालिकाएं हो सकती हैं।

बेशक आपको दो . की आवश्यकता होगी लिंक करने के लिए फ़ील्ड:एक विदेशी कुंजी फ़ील्ड और उस तालिका का नाम जिससे वह लिंक कर रहा है। आइए उन्हें foreignId कहते हैं और linkedTable

linkedTable एक एनम या एक स्ट्रिंग हो सकती है, अधिमानतः एनम (कम जगह), लेकिन यह केवल तभी संभव है जब आप जिन विभिन्न तालिकाओं से लिंक करना चाहते हैं, वे तय हैं।

आइए एक बेहद मूर्खतापूर्ण उदाहरण दें। आपके पास एक विशाल उपयोगकर्ता तालिका है users जिनमें से कुछ उपयोगकर्ता बिल्कुल एक . जोड़ सकते हैं उनकी प्रोफ़ाइल में डेटा का व्यक्तिगत सेट। यह एक शौक, एक पालतू जानवर, एक खेल के बारे में हो सकता है जिसका वे अभ्यास करते हैं या उनका पेशा। अब यह जानकारी चारों मामलों में अलग है। (4 संभावित टेबल हकीकत में हैं नहीं इस संरचना को सही ठहराने के लिए पर्याप्त)

अब मान लेते हैं linkedTable संभावित मूल्यों के साथ एक एनम है pets , hobbies , sports और professions , जो चार अलग-अलग संरचित तालिकाओं के नाम हैं। मान लें id उन चारों में पेकी है।

उदाहरण के लिए आप इस प्रकार शामिल हों:

SELECT * FROM users 
    LEFT JOIN  pets        ON linkedTable = 'pets'        AND foreignId = pets.id
    LEFT JOIN  hobbies     ON linkedTable = 'hobbies'     AND foreignId = hobbies.id
    LEFT JOIN  sports      ON linkedTable = 'sports'      AND foreignId = sports.id
    LEFT JOIN  professions ON linkedTable = 'professions' AND foreignId = professions.id

यह सिर्फ एक बुनियादी मजाक देने के लिए है। चूंकि आपको शायद केवल दुर्लभ मामलों में लिंक की आवश्यकता होती है, इसलिए जब आप उपयोगकर्ताओं के माध्यम से लूप करते हैं (बिना शामिल हुए) तो आप अपनी प्रोग्रामिंग भाषा, जैसे PHP, में लुकअप करने की अधिक संभावना रखते हैं।

आजमाना चाहते हैं? आप इस परीक्षण डेटाबेस के निर्माण के साथ इसे स्वयं आज़मा सकते हैं (सुनिश्चित करें कि आप एक परीक्षण डेटाबेस का उपयोग करते हैं):

CREATE TABLE IF NOT EXISTS `users` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(100) NOT NULL , 
    `linkedTable` ENUM('pets','hobbies','sports','professions') NULL DEFAULT NULL , 
    `foreignId` INT NULL DEFAULT NULL , 
  PRIMARY KEY (`id`), INDEX (`linkedTable`)
) ;

CREATE TABLE  IF NOT EXISTS `pets` ( 
    `id` INT NOT NULL AUTO_INCREMENT , 
    `animalTypeId` INT NOT NULL , 
    `name` VARCHAR(100) NOT NULL , 
    `colorId` INT NOT NULL , 
  PRIMARY KEY (`id`), INDEX (`animalTypeId`), INDEX (`colorId`)
) ;

CREATE TABLE  IF NOT EXISTS `hobbies` ( 
    `id` INT NOT NULL AUTO_INCREMENT , 
    `hobbyTypeId` INT NOT NULL , 
    `hoursPerWeekSpend` INT NOT NULL , 
    `websiteUrl` VARCHAR(300) NULL , 
  PRIMARY KEY (`id`), INDEX (`hobbyTypeId`)
) ;

CREATE TABLE  IF NOT EXISTS `sports` ( 
    `id` INT NOT NULL AUTO_INCREMENT , 
    `sportTypeId` INT NOT NULL , 
    `hoursPerWeekSpend` INT NOT NULL , 
    `nameClub` VARCHAR(100) NULL , 
    `professional` TINYINT NOT NULL DEFAULT 0, 
  PRIMARY KEY (`id`), INDEX (`sportTypeId`)
) ;

CREATE TABLE  IF NOT EXISTS `professions` ( 
    `id` INT NOT NULL AUTO_INCREMENT , 
    `professionId` INT NOT NULL , 
    `hoursPerWeek` INT NOT NULL , 
    `nameCompany` VARCHAR(100) NULL , 
    `jobDescription` VARCHAR(400) NULL, 
  PRIMARY KEY (`id`), INDEX (`professionId`)
) ;


INSERT INTO `users` (`id`, `name`, `linkedTable`, `foreignId`) 
   VALUES 
   (NULL, 'Hank', 'pets', '1'), 
   (NULL, 'Peter', 'hobbies', '2'), 
   (NULL, 'Muhammed', 'professions', '1'), 
   (NULL, 'Clarice', NULL, NULL), 
   (NULL, 'Miryam', 'professions', '2'), 
   (NULL, 'Ming-Lee', 'hobbies', '1'), 
   (NULL, 'Drakan', NULL, NULL), 
   (NULL, 'Gertrude', 'sports', '2'), 
   (NULL, 'Mbase', NULL, NULL);


INSERT INTO `pets` (`id`, `animalTypeId`, `name`, `colorId`) 
VALUES (NULL, '1', 'Mimi', '3'), (NULL, '2', 'Tiger', '8');

INSERT INTO `hobbies` (`id`, `hobbyTypeId`, `hoursPerWeekSpend`, `websiteUrl`) 
VALUES (NULL, '123', '21', NULL), (NULL, '2', '1', 'http://www.freesoup.org');

INSERT INTO `sports` (`id`, `sportTypeId`, `hoursPerWeekSpend`, `nameClub`, `professional`) 
VALUES (NULL, '2', '3', 'Racket to Racket', '0'), (NULL, '12', '34', NULL, '1');

INSERT INTO `professions` (`id`, `professionId`, `hoursPerWeek`, `nameCompany`, `jobDescription`) 
VALUES (NULL, '275', '40', 'Ben & Jerry\'s', 'Ice cream designer'), (NULL, '21', '24', 'City of Dublin', 'Garbage collector');

फिर पहली क्वेरी चलाएँ।

चर्चा के लिए मजेदार नोट:आप इसे अनुक्रमित करें?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अज्ञात कॉलम '' 'फ़ील्ड सूची' में। जैंगो

  2. बहुभुज के भीतर mysql क्वेरी बिंदु - कोई परिणाम नहीं

  3. PHP MySQL से एक्सेल स्प्रेडशीट में कनवर्ट करें कॉलम ऑटोसाइज करें

  4. mysql n अंतिम पंक्तियों में से चुनें

  5. डुप्लीकेट द्वारा MySQL ऑर्डर पहले शीर्ष