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

SQL परिणाम तालिका, दूसरी तालिका SET प्रकार में मिलान करें

जंक्शन/प्रतिच्छेद तालिका उपयोग का उदाहरण।

create table subscription_plans
(
    id int not null auto_increment primary key, -- common practice
    name varchar(40) not null,
    description varchar(255) not null,
    price decimal(12,2) not null
    -- additional indexes:
);

create table pricing_offers
(
    id int not null auto_increment primary key, -- common practice
    name varchar(40) not null,
    description varchar(255) not null
    -- additional indexes:
);

create table so_junction
(   -- intersects mapping subscription_plans and pricing_offers
    id int not null auto_increment primary key, -- common practice
    subId int not null,
    offerId int not null,

    -- row cannot be inserted/updated if subId does not exist in parent table
    -- the fk name is completely made up
    -- parent row cannot be deleted and thus orphaning children
    CONSTRAINT fk_soj_subplans 
        FOREIGN KEY (subId)
        REFERENCES subscription_plans(id),

    -- row cannot be inserted/updated if offerId does not exist in parent table
    -- the fk name is completely made up
    -- parent row cannot be deleted and thus orphaning children
    CONSTRAINT fk_soj_priceoffer 
        FOREIGN KEY (offerId)
        REFERENCES pricing_offers(id),

    -- the below allows for only ONE combo of subId,offerId
    CONSTRAINT soj_unique_ids unique (subId,offerId)
    -- additional indexes:
);

insert into subscription_plans (name,description,price) values ('plan_A','description',9.99);
insert into subscription_plans (name,description,price) values ('plan_B','description',19.99);
insert into subscription_plans (name,description,price) values ('plan_C','description',29.99);
select * from subscription_plans;

insert into pricing_offers (name,description) values ('free donuts','you get free donuts, limit 3');
insert into pricing_offers (name,description) values ('extra sauce','extra sauce');
insert into pricing_offers (name,description) values ('poney ride','Free ride on Wilbur');
insert into pricing_offers (name,description) values ('bus fare -50%','domestic less 50');

select * from pricing_offers;

insert so_junction(subId,offerId) values (1,1); -- free donuts to plans
insert so_junction(subId,offerId) values (1,2),(2,2),(3,2); -- extra sauce to plans
insert so_junction(subId,offerId) values (3,3); -- wilbur
insert so_junction(subId,offerId) values (1,4),(2,4),(3,4); -- bus to plans
select * from so_junction;

-- try to add another of like above to so_junction
-- Error Code 1062: Duplicate entry

-- show joins of all
select s.*,p.*
from subscription_plans s
join so_junction so
on so.subId=s.id
join pricing_offers p
on p.id=so.offerId
order by s.name,p.name

-- show extra sauce intersects
select s.*,p.*
from subscription_plans s
join so_junction so
on so.subId=s.id
join pricing_offers p
on p.id=so.offerId
where p.name='extra sauce'
order by s.name,p.name

मूल रूप से आप जंक्शन तालिका से सम्मिलित करते हैं और हटाते हैं (इस उदाहरण में वास्तव में कभी भी अच्छा अपडेट नहीं होता है)।

बिना इंडेक्स के धीमे, बोझिल सेट के साथ गड़बड़ किए बिना स्वच्छ और तेज़ जुड़ता है

अब कोई भी विलबर द पोनी की सवारी नहीं कर सकता है? फिर

delete from so_junction
where offerId in (select id from pricing_offers where name='poney ride')

पूछें कि क्या आपके कोई प्रश्न हैं।

और शुभकामनाएँ!




  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 में एकाधिक तालिकाओं से COUNT(*)

  3. समूह गणना के प्रतिशत की गणना(*)

  4. Oracle में MySQL अस्थायी तालिका के लिए वैकल्पिक

  5. क्लाइंट को MySQL सर्वर से सफलतापूर्वक कनेक्ट करें