Qanday qilib ichki jadvalga boshqa ikkita ustunni kiritish mumkin?

Menda SQL bayoni bor:

SELECT * FROM newsTable INNER JOIN picTable on picTable.picID = newsTable.newsPicID

Bu tanlangan tasvirni bir stoldan boshqa bir jadvaldagi yangiliklar bilan bog'laydi.

Bu faqat bitta tasvir uchun ishlaydi, lekin agar bitta hikoya uchun qo'shilishi mumkin bo'lgan 3 ta rasmga ega bo'lishim kerak bo'lsa, yangi SQL iborasi qanday ko'rinadi?

yangi SQL iborasining sintaksisini aylantira olmayman.

Har qanday yo'l-yo'riq juda qadrli.

newsTable

newsID
newsTitle
newsBody
newsPicID
newsPicIDTwo
newsPicIDThree

picTable

picID
picFileName
picPath
3
Uzr so'raganim uchun afsusdaman, lekin jarlh to'g'ri deb o'ylayman. Yaxshi JB dizayni sub'ektiv emas. OP ko'pchilik munosabatlarga klassik 1ni ochib beradi. Jadvallarni loyihalash uchun bunday usul ma'lum va bunga rioya qilgan holda noto'g'ri.
qo'shib qo'ydi muallif apomene, manba
faqatgina NewsTable va picTableni bir-biriga ulash uchun yana bir jadval yaratib berish juda ham oson va so'rovlar ham oson bo'ladi
qo'shib qo'ydi muallif vims liu, manba
@jarlh Bu biroz özneldir, agar har bir yozuv uchun 3 ta rasm bo'lishi kerak bo'lsa, unda bu yaxshi dizayni yoki eng ko'p 3 rasm bo'lsa, u to'liq me'yorlashtirilmasligi mumkin, lekin bu har doim ham emas yomon narsa. Jadvaldagi AddressLine1, AddressLine2, AddressLine3 ga ega bo'lish yomon dizayn emas, men alohida AddressLine jadvalini himoyalashni istamayman. Ehtimol, alohida jadval bu eng yaxshi echim bo'lishi mumkin, ammo men taqdim etilgan ma'lumotlarga ishonchim komil emas.
qo'shib qo'ydi muallif GarethD, manba
Siz taxminlar qilyapsiz. Agar faqatgina 3 ta rasm bo'lishi mumkinligi ma'lum bo'lsa, unda bu bilan hech qanday muammo yo'q va so'rovlar 3-raqamni bir xil satrda olishni osonlashtiradi, shuning uchun rasmlarning sonini 3 chegaralab bo'lmaydi. Ushbu soddalikning narxi moslashuvchanlikning etishmasligi, lekin agar bu hech qachon yoki kamdan-kam hollarda o'zgarishi ma'lum bo'lsa, u yomon dizayn emas. Men sizga noto'g'ri deb aytmayman, mening fikrimcha, mavjud bo'lgan ma'lumotlarga asoslangan holda "Yomon Tasarım" ning adolatli bayonotini qilolmaysiz.
qo'shib qo'ydi muallif GarethD, manba
@pomene Men uni noto'g'ri deb aytmayman. Aytmoqchimanki, u to'g'ri ekanini bilishning iloji yo'q. Keling, Muqova fotosurati va profil rasmiga ega bo'lgan Facebook profilidagi sahifa turi senaryosini ko'rib chiqaylik. Ushbu stsenariyda, profil jadvalidagi, CoverPictureID va ProfilePictureID-da ikkita ustun bor edi. Siz aytayotgan narsa bu noto'g'ri va alohida stolda saqlanishi kerak. Subyektiv bo'lishi mumkin, ehtimol, to'g'ri so'z emas edi, lekin u 3 ustunga saqlanishi kerakmi yoki yo'qmi, yoki alohida stolda 3 satr qora va oq emas va bizda mavjud bo'lmagan ma'lumotlarga bog'liq.
qo'shib qo'ydi muallif GarethD, manba
Yomon jadvallar dizayni. Rasmlarga rasm qo'shish uchun boshqa jadval kerak.
qo'shib qo'ydi muallif jarlh, manba
@GarethD, va keyin bir kishi bir maqolaga 4-rasmni to'ldirmoqchi. Men jadvalni qo'shish pic4 o'zgartirishni tavsiya etmayman ... (Bir manzil shakli ko'p yoki kamroq bir xil, yangi darajalar tez-tez qo'shilmaydi.)
qo'shib qo'ydi muallif jarlh, manba
@vimsliu menga anoter jadvali bilan buni qanday qilishim mumkinligini ko'rsatib bera olasizmi?
qo'shib qo'ydi muallif davvv, manba

6 javoblar

Rasm ma'lumotlarini kiritish uchun ikki marta qo'shilishingiz mumkin:

SELECT t1.*,
       COALESCE(t2.picFileName, 'NA') AS picFileName1,
       COALESCE(t3.picFileName, 'NA') AS picFileName2,
       COALESCE(t4.picFileName, 'NA') AS picFileName3
FROM newsTable t1
LEFT JOIN picTable t2
    ON t1.newsPicID      = t2.picID
LEFT JOIN picTable t3
    ON t1.newsPicIDTwo   = t3.picID
LEFT JOIN picTable t4
    ON t1.newsPicIDThree = t4.picID

Siz kerakli ravishda bu erda picTable dan qo'shimcha ustunlar qo'shishingiz mumkin va yangiliklar elementida hech qanday rasm ma'lumoti bo'lmasa, asl qiymati qiymatni ta'minlash uchun yana COALESCE() dan foydalaning.

3
qo'shib qo'ydi
Ular jadval aliases deb ataladi. Bir jadvalni takrorlangandan so'ng, masalan. t1 , so'rovning qolgan qismida ushbu jadvalga t1 sifatida murojaat qilishingiz mumkin. Ular savollarni o'qishni osonroq qilish uchun tanishtirildi, barchasi shu.
qo'shib qo'ydi muallif Tim Biegeleisen, manba
Bir oz qalin Tim uchun bo'lganim uchun meni kechir, lekin t1, t2, t3 va boshqalar nima? Va asl qiymati bir narsa bo'lishi mumkinmi?
qo'shib qo'ydi muallif davvv, manba

Balki shunga o'xshash:

SELECT newsTable.*, pic.*, picTwo.*, picThree.*
FROM newsTable
INNER JOIN picTable AS pic on picTable.picID = newsTable.newsPicID 
INNER JOIN picTable AS picTwo on picTable.picID = newsTable.newsPicIDTwo
INNER JOIN picTable AS picThree on picTable.picID = newsTable.newsPicIDThree

agar NewsPicIDTwo yoki newsPicIDThree NULL bo'lsa, u holda siz SHEFT OUTTER JOIN

2
qo'shib qo'ydi

Muammoingizni tasvirlab berganingizdek, yangiliklardan tasvirlarga ko'plab munosabatlar mavjud. Ya'ni, har bir xabar kimligi bir necha picds bo'lishi mumkin.   newsTable ustidagi newsPicIDTwo va newsPicIDThree maydonchalariga kerak emasligini ko'rsating va newsid maydoniga kerakli kod picTable . Shunchaki, keyin

SELECT * FROM newsTable INNER JOIN picTable on picTable.newsID = newsTable.newsID

Will bring you the correct result if you have records on picTable that have same newsID but different picID

Boshqacha aytganda, xorijiy kalit "Ko'p" stolida joylashgan klassik 1-Ko'p munosabatlar to'g'ri hal etiladi.

Sizning holatlaringizda "ko'p" stol picTable xorij kodli newsid kodi bo'lishi kerak.

1
qo'shib qo'ydi

picTable faqat uchta marta chap burchakka qo'shiling:

select *
from newsTable t
left join picTable p1 on p1.picID = t.newsPicID
left join picTable p2 on p2.picID = t.newsPicIDTwo
left join picTable p3 on p3.picID = t.newsPicIDThree
1
qo'shib qo'ydi
Use LEFT OUTER JOIN to get three pictures :

SELECT * FROM newsTable 
LEFT OUTER JOIN picTable PIC1 on PIC1.picID = newsTable.newsPicID
LEFT OUTER JOIN picTable PIC2 on PIC2.picID = newsTable.newsPicIDTwo
LEFT OUTER JOIN picTable PIC3 on PIC3.picID = newsTable.newsPicIDThree
1
qo'shib qo'ydi

Appropraite ustunlariga yana qo'shiling. Agar rasm ustunlarimdan biri bo'sh bo'lsa, chap qo'shimchalardan foydalanganman

SELECT NT.*, p1.picFileName as P1File, p2.picFileName as P2File, p3.picFileName as P3File
FROM newsTable NT
LEFT JOIN picTable P1 
  on P1.picID = NT.newsPicID
LEFT JOIN picTable P2 
  on P2.picID = NT.newsPicIDtwo
LEFT JOIN picTable P3
  on P3.picID = NT.newsPicIDthree
0
qo'shib qo'ydi