MySQL: Jadvallar shu ustunga qo'shilsa, nima uchun jadvallar ustunidan foydalanishni ko'rsatishim kerak?

Agar ikkita jadvalim bo'lsa:

+-----------------+
+ people          |
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | Joe  |  42 |
|  2 | Sue  |  30 |
+----+------+-----+

+-------------------+
+ employees         |
+----+------+-------+
| id | dept | hired |
+----+------+-------+
|  1 | HR   |  2015 |
|  2 | Dev  |  2013 |
+----+------+-------+

Va men shunga o'xshash kishi uchun so'rov qilaman:

SELECT * FROM employees JOIN people ON employees.id=people.id WHERE id=2;

Nima uchun bu xato qilishadi? id ni bilaman noyob emas, lekin JOIN bilan ulashilishi kerak, chunki uni umumiy deb majbur qilaman. Bundan tashqari men buni SELECT *, people.id AS kimligi ... deb so'rab, uni chetlab o'tishim mumkinligini bilaman, biroq bu muammo hal qilish uchun emas, balki nazariy masaladir.

Bu faqat MySQL-larni etarli darajada ishlab chiqarmaydimi? Yoki bu xatolarni tashlash uchun asosli sabab bormi?

1
Ehtimol, bu mumkin, lekin nima uchun? Sizga bir nechta tugmachalarni tejash uchun ko'proq ishlov berish. Qanday bo'lmasin, u hech narsa qilinmadi. Shuning uchun siz buni belgilashingiz kerak.
qo'shib qo'ydi muallif Ilion, manba
Ehtimol, bu mumkin, lekin nima uchun? Sizga bir nechta tugmachalarni tejash uchun ko'proq ishlov berish. Qanday bo'lmasin, u hech narsa qilinmadi. Shuning uchun siz buni belgilashingiz kerak.
qo'shib qo'ydi muallif Ilion, manba
Ehtimol, bu mumkin, lekin nima uchun? Sizga bir nechta tugmachalarni tejash uchun ko'proq ishlov berish. Qanday bo'lmasin, u hech narsa qilinmadi. Shuning uchun siz buni belgilashingiz kerak.
qo'shib qo'ydi muallif Ilion, manba
@Jorge Mening misol soddalashtirildi. Mening jadvalim uchun so'rovlar yozyapman, chunki men har ikkala jadvalda ham ko'proq odamlarga o'xshardi. Men faqatgina ikkala jadval bir xil ustun nomiga qo'shilganda (va hech qanday boshqa jadvallar birlashtirilgan ismlarga ega bo'lganda) boshqa nomga qo'shilganda buni tan olishni taklif qildim. Masalan, table.id o'rniga jadvallar uchun table.table_id strukturasini ishlatadigan kamdan-kam guruhda bo'laman
qo'shib qo'ydi muallif Bing, manba
@Jorge Mening misol soddalashtirildi. Mening jadvalim uchun so'rovlar yozyapman, chunki men har ikkala jadvalda ham ko'proq odamlarga o'xshardi. Men faqatgina ikkala jadval bir xil ustun nomiga qo'shilganda (va hech qanday boshqa jadvallar birlashtirilgan ismlarga ega bo'lganda) boshqa nomga qo'shilganda buni tan olishni taklif qildim. Masalan, table.id o'rniga jadvallar uchun table.table_id strukturasini ishlatadigan kamdan-kam guruhda bo'laman
qo'shib qo'ydi muallif Bing, manba
@Jorge Mening misol soddalashtirildi. Mening jadvalim uchun so'rovlar yozyapman, chunki men har ikkala jadvalda ham ko'proq odamlarga o'xshardi. Men faqatgina ikkala jadval bir xil ustun nomiga qo'shilganda (va hech qanday boshqa jadvallar birlashtirilgan ismlarga ega bo'lganda) boshqa nomga qo'shilganda buni tan olishni taklif qildim. Masalan, table.id o'rniga jadvallar uchun table.table_id strukturasini ishlatadigan kamdan-kam guruhda bo'laman
qo'shib qo'ydi muallif Bing, manba
@Jorge Mening misol soddalashtirildi. Mening jadvalim uchun so'rovlar yozyapman, chunki men har ikkala jadvalda ham ko'proq odamlarga o'xshardi. Men faqatgina ikkala jadval bir xil ustun nomiga qo'shilganda (va hech qanday boshqa jadvallar birlashtirilgan ismlarga ega bo'lganda) boshqa nomga qo'shilganda buni tan olishni taklif qildim. Masalan, table.id o'rniga jadvallar uchun table.table_id strukturasini ishlatadigan kamdan-kam guruhda bo'laman
qo'shib qo'ydi muallif Bing, manba
Balki buni qilish mumkin, lekin nima uchun? Sizga bir nechta tugmachalarni tejash uchun ko'proq ishlov berish. Har qanday zamonaviy til bu printsipga asoslangan. Nima deb o'ylayman, agar "biz hali bu fikrni amalga oshira olmaganimizdan qat'iy nazar haqiqiy mantiqiy sabab bo'lsa".
qo'shib qo'ydi muallif Bing, manba
Balki buni qilish mumkin, lekin nima uchun? Sizga bir nechta tugmachalarni tejash uchun ko'proq ishlov berish. Har qanday zamonaviy til bu printsipga asoslangan. Nima deb o'ylayman, agar "biz hali bu fikrni amalga oshira olmaganimizdan qat'iy nazar haqiqiy mantiqiy sabab bo'lsa".
qo'shib qo'ydi muallif Bing, manba
Ustunlarni filtrlashdan oldin JOINni bajarmaydi? So'ngra u qaysi ustunlarni YO'QNATsagina kuzatib turishi va agar ular ismni ulashsa, ularni bitta ustunga (yoki umumiy tanlangan nomning har bir umumiy ustuniga sayg'oqni avto-takrorlash uchun) ? U (1) ishlashi bilan ajralish darajasida bajarilishi mumkin. Biror narsani yo'qotishim kerak, lekin aniq nima bilmayman.
qo'shib qo'ydi muallif Bing, manba
Ustunlarni filtrlashdan oldin JOINni bajarmaydi? So'ngra u qaysi ustunlarni YO'QNATsagina kuzatib turishi va agar ular ismni ulashsa, ularni bitta ustunga (yoki umumiy tanlangan nomning har bir umumiy ustuniga sayg'oqni avto-takrorlash uchun) ? U (1) ishlashi bilan ajralish darajasida bajarilishi mumkin. Biror narsani yo'qotishim kerak, lekin aniq nima bilmayman.
qo'shib qo'ydi muallif Bing, manba
Ustunlarni filtrlashdan oldin JOINni bajarmaydi? So'ngra u qaysi ustunlarni YO'QNATsagina kuzatib turishi va agar ular ismni ulashsa, ularni bitta ustunga (yoki umumiy tanlangan nomning har bir umumiy ustuniga sayg'oqni avto-takrorlash uchun) ? U (1) ishlashi bilan ajralish darajasida bajarilishi mumkin. Biror narsani yo'qotishim kerak, lekin aniq nima bilmayman.
qo'shib qo'ydi muallif Bing, manba
Ustunlarni filtrlashdan oldin JOINni bajarmaydi? So'ngra u qaysi ustunlarni YO'QNATsagina kuzatib turishi va agar ular ismni ulashsa, ularni bitta ustunga (yoki umumiy tanlangan nomning har bir umumiy ustuniga sayg'oqni avto-takrorlash uchun) ? U (1) ishlashi bilan ajralish darajasida bajarilishi mumkin. Biror narsani yo'qotishim kerak, lekin aniq nima bilmayman.
qo'shib qo'ydi muallif Bing, manba
Uchta jadval namunasini ishlatish: bu juda yomon nomlash konventsiyasi bo'lib, uchun table_id nomlash qoidalarini ishlatadigan odamlarning "noyob guruhiga" har jadvalida. Misol uchun, agar men elektron pochta manzili bilan bir kishining ismi bilan bitta qatorga ega bo'lishim uchun email_addresses.person_id = people.person_id = employees.person_ & zwnj; id ni JOIN yuborishni istasam, men shaxsan_idning keng tarqalganligini bilaman, chunki men nodonlik bilan turli xil person_id ustunini hech qanday sababsiz yaratadi, shuning uchun PHP $ row ["person_id"] foydalanishga yaroqli bo'ladi. Men uchun amaliy ko'ringan, lekin ehtimol men "kamdan-kam odam" deb hisoblayman :)
qo'shib qo'ydi muallif Bing, manba
Uchta jadval namunasini ishlatish: bu juda yomon nomlash konventsiyasi bo'lib, uchun table_id nomlash qoidalarini ishlatadigan odamlarning "noyob guruhiga" har jadvalida. Misol uchun, agar men elektron pochta manzili bilan bir kishining ismi bilan bitta qatorga ega bo'lishim uchun email_addresses.person_id = people.person_id = employees.person_ & zwnj; id ni JOIN yuborishni istasam, men shaxsan_idning keng tarqalganligini bilaman, chunki men nodonlik bilan turli xil person_id ustunini hech qanday sababsiz yaratadi, shuning uchun PHP $ row ["person_id"] foydalanishga yaroqli bo'ladi. Men uchun amaliy ko'ringan, lekin ehtimol men "kamdan-kam odam" deb hisoblayman :)
qo'shib qo'ydi muallif Bing, manba
Uchta jadval namunasini ishlatish: bu juda yomon nomlash konventsiyasi bo'lib, uchun table_id nomlash qoidalarini ishlatadigan odamlarning "noyob guruhiga" har jadvalida. Misol uchun, agar men elektron pochta manzili bilan bir kishining ismi bilan bitta qatorga ega bo'lishim uchun email_addresses.person_id = people.person_id = employees.person_ & zwnj; id ni JOIN yuborishni istasam, men shaxsan_idning keng tarqalganligini bilaman, chunki men nodonlik bilan turli xil person_id ustunini hech qanday sababsiz yaratadi, shuning uchun PHP $ row ["person_id"] foydalanishga yaroqli bo'ladi. Men uchun amaliy ko'ringan, lekin ehtimol men "kamdan-kam odam" deb hisoblayman :)
qo'shib qo'ydi muallif Bing, manba
Uchta jadval namunasini ishlatish: bu juda yomon nomlash konventsiyasi bo'lib, uchun table_id nomlash qoidalarini ishlatadigan odamlarning "noyob guruhiga" har jadvalida. Misol uchun, agar men elektron pochta manzili bilan bir kishining ismi bilan bitta qatorga ega bo'lishim uchun email_addresses.person_id = people.person_id = employees.person_ & zwnj; id ni JOIN yuborishni istasam, men shaxsan_idning keng tarqalganligini bilaman, chunki men nodonlik bilan turli xil person_id ustunini hech qanday sababsiz yaratadi, shuning uchun PHP $ row ["person_id"] foydalanishga yaroqli bo'ladi. Men uchun amaliy ko'ringan, lekin ehtimol men "kamdan-kam odam" deb hisoblayman :)
qo'shib qo'ydi muallif Bing, manba
Siz bu "guruh" ning qanchalik katta ekanligiga hayron bo'lishdingiz :)! Sizning namunangiz bilan bir xil nomdagi ustunlar bilan ham, siz qo'shilamaning boshqa ikki ismi bilan bir xil ustunga qo'shilishda uchinchi jadval kabi boshqa ishlarni ko'rib chiqing va qo'shilishning bir qismi emas birinchi ikkita uchun yaxshi bo'lar edi, lekin uchinchi nima haqida? t1 (id, ism); t2 (id, ish); t3 (id, id_t2, bla) bu erda id = 2 qoidasini qanday hal qiladi? Tahlilchi muayyan kichik vaziyatlarni qayta ishlashga to'g'ri keladi, shuning uchun uni bekor qilmaydi.
qo'shib qo'ydi muallif Jorge Campos, manba
Siz bu "guruh" ning qanchalik katta ekanligiga hayron bo'lishdingiz :)! Sizning namunangiz bilan bir xil nomdagi ustunlar bilan ham, siz qo'shilamaning boshqa ikki ismi bilan bir xil ustunga qo'shilishda uchinchi jadval kabi boshqa ishlarni ko'rib chiqing va qo'shilishning bir qismi emas birinchi ikkita uchun yaxshi bo'lar edi, lekin uchinchi nima haqida? t1 (id, ism); t2 (id, ish); t3 (id, id_t2, bla) bu erda id = 2 qoidasini qanday hal qiladi? Tahlilchi muayyan kichik vaziyatlarni qayta ishlashga to'g'ri keladi, shuning uchun uni bekor qilmaydi.
qo'shib qo'ydi muallif Jorge Campos, manba
Siz bu "guruh" ning qanchalik katta ekanligiga hayron bo'lishdingiz :)! Sizning namunangiz bilan bir xil nomdagi ustunlar bilan ham, siz qo'shilamaning boshqa ikki ismi bilan bir xil ustunga qo'shilishda uchinchi jadval kabi boshqa ishlarni ko'rib chiqing va qo'shilishning bir qismi emas birinchi ikkita uchun yaxshi bo'lar edi, lekin uchinchi nima haqida? t1 (id, ism); t2 (id, ish); t3 (id, id_t2, bla) bu erda id = 2 qoidasini qanday hal qiladi? Tahlilchi muayyan kichik vaziyatlarni qayta ishlashga to'g'ri keladi, shuning uchun uni bekor qilmaydi.
qo'shib qo'ydi muallif Jorge Campos, manba
Siz bu "guruh" ning qanchalik katta ekanligiga hayron bo'lishdingiz :)! Sizning namunangiz bilan bir xil nomdagi ustunlar bilan ham, siz qo'shilamaning boshqa ikki ismi bilan bir xil ustunga qo'shilishda uchinchi jadval kabi boshqa ishlarni ko'rib chiqing va qo'shilishning bir qismi emas birinchi ikkita uchun yaxshi bo'lar edi, lekin uchinchi nima haqida? t1 (id, ism); t2 (id, ish); t3 (id, id_t2, bla) bu erda id = 2 qoidasini qanday hal qiladi? Tahlilchi muayyan kichik vaziyatlarni qayta ishlashga to'g'ri keladi, shuning uchun uni bekor qilmaydi.
qo'shib qo'ydi muallif Jorge Campos, manba
Bundan tashqari, sizning modelingiz odatiy emas, sizning ishingiz bo'yicha stol xodimlariga kerak emas va ishchilar ustunlari odamlar jadvalida bo'lishi kerak.
qo'shib qo'ydi muallif Jorge Campos, manba
Siz uni noyob qilib qo'yganingizdan (u bilan qo'shilishingizdan) muhim emas. SQL sintaksik tahlil qiluvchisini o'ylab ko'ring, qaysi jadvaldan qaysi filtrni qaysi filtrdan saralab olish kerakligini bilib olasizmi?
qo'shib qo'ydi muallif Jorge Campos, manba
Bundan tashqari, sizning modelingiz odatiy emas, sizning ishingiz bo'yicha stol xodimlariga kerak emas va ishchilar ustunlari odamlar jadvalida bo'lishi kerak.
qo'shib qo'ydi muallif Jorge Campos, manba
Bundan tashqari, sizning modelingiz odatiy emas, sizning ishingiz bo'yicha stol xodimlariga kerak emas va ishchilar ustunlari odamlar jadvalida bo'lishi kerak.
qo'shib qo'ydi muallif Jorge Campos, manba
Siz uni noyob qilib qo'yganingizdan (u bilan qo'shilishingizdan) muhim emas. SQL sintaksik tahlil qiluvchisini o'ylab ko'ring, qaysi jadvaldan qaysi filtrni qaysi filtrdan saralab olish kerakligini bilib olasizmi?
qo'shib qo'ydi muallif Jorge Campos, manba
Bundan tashqari, sizning modelingiz odatiy emas, sizning ishingiz bo'yicha stol xodimlariga kerak emas va ishchilar ustunlari odamlar jadvalida bo'lishi kerak.
qo'shib qo'ydi muallif Jorge Campos, manba
Ma'lumotlar bazasi standartlari (SQL ANSI) juda qadimgi, shuning uchun nima uchun ular bunday qilmadi? Kunning o'zida ishlashda saqlab qolishingiz kerak bo'lgan hamma narsalar muhim edi, shuning uchun standart bo'ldi. Bundan tashqari, siz o'ylayotganday oddiy emas. Bu tasavvurni tasavvur qiling: t1 (id, name); t1.id = t2.id_t1

t1 (id, id_t1, title) t1.id = t2.id_t1 > Bu yerda id = 2 ?

qo'shib qo'ydi muallif Jorge Campos, manba
Ma'lumotlar bazasi standartlari (SQL ANSI) juda qadimgi, shuning uchun nima uchun ular bunday qilmadi? Kunning o'zida ishlashda saqlab qolishingiz kerak bo'lgan hamma narsalar muhim edi, shuning uchun standart bo'ldi. Bundan tashqari, siz o'ylayotganday oddiy emas. Bu tasavvurni tasavvur qiling: t1 (id, name); t1.id = t2.id_t1

t1 (id, id_t1, title) t1.id = t2.id_t1 > Bu yerda id = 2 ?

qo'shib qo'ydi muallif Jorge Campos, manba
Ma'lumotlar bazasi standartlari (SQL ANSI) juda qadimgi, shuning uchun nima uchun ular bunday qilmadi? Kunning o'zida ishlashda saqlab qolishingiz kerak bo'lgan hamma narsalar muhim edi, shuning uchun standart bo'ldi. Bundan tashqari, siz o'ylayotganday oddiy emas. Bu tasavvurni tasavvur qiling: t1 (id, name); t1.id = t2.id_t1

t1 (id, id_t1, title) t1.id = t2.id_t1 > Bu yerda id = 2 ?

qo'shib qo'ydi muallif Jorge Campos, manba
Ma'lumotlar bazasi standartlari (SQL ANSI) juda qadimgi, shuning uchun nima uchun ular bunday qilmadi? Kunning o'zida ishlashda saqlab qolishingiz kerak bo'lgan hamma narsalar muhim edi, shuning uchun standart bo'ldi. Bundan tashqari, siz o'ylayotganday oddiy emas. Bu tasavvurni tasavvur qiling: t1 (id, name); t1.id = t2.id_t1

t1 (id, id_t1, title) t1.id = t2.id_t1 > Bu yerda id = 2 ?

qo'shib qo'ydi muallif Jorge Campos, manba
Inson ko'ziga bu ochiq-oydin, ammo kompyuter uchun juda ko'p. Bu kabi kichik bir vaziyatda ajralmas qismida ishlash uchun chimishni osonlashtiradi, endi ushbu so'rovni ID bilan jadvallar yuzlab (argumentni qo'llash uchun shubhalanish) tasavvur qiling.
qo'shib qo'ydi muallif Jorge Campos, manba
Inson ko'ziga bu ochiq-oydin, ammo kompyuter uchun juda ko'p. Bu kabi kichik bir vaziyatda ajralmas qismida ishlash uchun chimishni osonlashtiradi, endi ushbu so'rovni ID bilan jadvallar yuzlab (argumentni qo'llash uchun shubhalanish) tasavvur qiling.
qo'shib qo'ydi muallif Jorge Campos, manba
Inson ko'ziga bu ochiq-oydin, ammo kompyuter uchun juda ko'p. Bu kabi kichik bir vaziyatda ajralmas qismida ishlash uchun chimishni osonlashtiradi, endi ushbu so'rovni ID bilan jadvallar yuzlab (argumentni qo'llash uchun shubhalanish) tasavvur qiling.
qo'shib qo'ydi muallif Jorge Campos, manba
Inson ko'ziga bu ochiq-oydin, ammo kompyuter uchun juda ko'p. Bu kabi kichik bir vaziyatda ajralmas qismida ishlash uchun chimishni osonlashtiradi, endi ushbu so'rovni ID bilan jadvallar yuzlab (argumentni qo'llash uchun shubhalanish) tasavvur qiling.
qo'shib qo'ydi muallif Jorge Campos, manba
MySQL oddiygina siz kimni taqqoslayotganingizni bilmaydi va bu holda, bu holda hech qanday farq yo'qligini aniqlay olmaydi
qo'shib qo'ydi muallif Strawberry, manba
MySQL oddiygina siz kimni taqqoslayotganingizni bilmaydi va bu holda, bu holda hech qanday farq yo'qligini aniqlay olmaydi
qo'shib qo'ydi muallif Strawberry, manba
Siz ustunlarni ON employees.id = people.id so'zlari bilan teng qildingiz, lekin ular hali ham ikki turli ustunlar. Agar siz so'rovda SELECT nomi id ni qo'shgan bo'lsangiz nima bo'ladi? uch id ning qaysi biri qaerda qoidasiga tegishli bo'lishi kerak? Tabiiy va inson miyasiga mantiqan to'g'ri kelishi raqamli mantiq bilan ishlamaydi degani emas.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Men qattiq nomlangan konventsiyalardan foydalanishni yoqtiraman. Siz uchun ishlatilayotgani uchun NATURAL JOIN tizimingiz uchun yanada foydali ko'rinadi. Agar kichik jadvalda virtual jadval yaratish, sizning maqsadingizga erishishni maqsad qilib qo'yadi va PHP $ row ["person_id"] uchun sizning harakatlaringizga mos keladigan tarzda ishlaydi.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Men qattiq nomlangan konventsiyalardan foydalanishni yoqtiraman. Siz uchun ishlatilayotgani uchun NATURAL JOIN tizimingiz uchun yanada foydali ko'rinadi. Agar kichik jadvalda virtual jadval yaratish, sizning maqsadingizga erishishni maqsad qilib qo'yadi va PHP $ row ["person_id"] uchun sizning harakatlaringizga mos keladigan tarzda ishlaydi.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Men qattiq nomlangan konventsiyalardan foydalanishni yoqtiraman. Siz uchun ishlatilayotgani uchun NATURAL JOIN tizimingiz uchun yanada foydali ko'rinadi. Agar kichik jadvalda virtual jadval yaratish, sizning maqsadingizga erishishni maqsad qilib qo'yadi va PHP $ row ["person_id"] uchun sizning harakatlaringizga mos keladigan tarzda ishlaydi.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Siz ustunlarni ON employees.id = people.id so'zlari bilan teng qildingiz, lekin ular hali ham ikki turli ustunlar. Agar siz so'rovda SELECT nomi id ni qo'shgan bo'lsangiz nima bo'ladi? uch id ning qaysi biri qaerda qoidasiga tegishli bo'lishi kerak? Tabiiy va inson miyasiga mantiqan to'g'ri kelishi raqamli mantiq bilan ishlamaydi degani emas.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Siz ustunlarni ON employees.id = people.id so'zlari bilan teng qildingiz, lekin ular hali ham ikki turli ustunlar. Agar siz so'rovda SELECT nomi id ni qo'shgan bo'lsangiz nima bo'ladi? uch id ning qaysi biri qaerda qoidasiga tegishli bo'lishi kerak? Tabiiy va inson miyasiga mantiqan to'g'ri kelishi raqamli mantiq bilan ishlamaydi degani emas.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba
Siz ustunlarni ON employees.id = people.id so'zlari bilan teng qildingiz, lekin ular hali ham ikki turli ustunlar. Agar siz so'rovda SELECT nomi id ni qo'shgan bo'lsangiz nima bo'ladi? uch id ning qaysi biri qaerda qoidasiga tegishli bo'lishi kerak? Tabiiy va inson miyasiga mantiqan to'g'ri kelishi raqamli mantiq bilan ishlamaydi degani emas.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba

6 javoblar

Sizning fikringizdagi ishlaringiz birlashtirilgan jadvallarni bir-biriga qarashdir va bu ko'rinishda bitta id ustuni mavjud. MySQL bu ko'rinishni pastki tanlov va tabiiy qo'shilish orqali moslashi mumkin.

SELECT * FROM (SELECT * FROM employees NATURAL JOIN people) AS t2 WHERE id=2;

Bu esa, barcha umumiy ustunlarni yiqitib, ularni birlashtirish sharti sifatida ishlatadi. Qaytgan ustunlar umumiy ustunlar tartibida bo'ladi, qolgan ustunlar birinchi jadvalni va qolgan ustunlarni ikkinchi stoldan iborat bo'ladi. Umumiy sütunlarda, agar bir nechta bo'lsa, ularning tartibi ikkinchi stolda boshqacha tartib bo'lsa ham, birinchi stolda bo'lganidek, bir xil bo'ladi.

Bu MySQL-dagi mantiqni sizning fikringizdagi ma'lumotlardan foydalangan holda amalga oshirishga imkon beradi.

ogohlantirish ga bir nechta umumiy ustun bo'lsa, natijalar siz kutgan narsalar bo'lmasligi mumkin. Keyin qo'shilish, har bir ustunni "o'yin" deb hisoblashlari uchun moslashtiradi. Agar ustunlar kalit yaratish uchun birlashtirilsa, bu kutilgan xatti-harakat. Shu bilan birga, bir xil nomdagi ikkita ustun bo'lishi mumkin, lekin kalitning bir qismi bo'lmagan turli xil maqsadlarda foydalanishingiz mumkin bo'lsa, siz bo'sh qator bilan tugashingiz mumkin.

1
qo'shib qo'ydi
NATURAL JOIN - bu javob, rahmat! Buni amalga oshirishim mumkin emas (chunki siz va boshqalar buni kutilmagan xulq-atvorga olib kelishi mumkin, chunki u endi begona so'rovlarni qo'zg'atmaydi), ammo bu savolga javob berganda, siz aniq javob bergansiz. Menga nimadir o'rgatganingiz uchun tashakkur!
qo'shib qo'ydi muallif Bing, manba
Bu juda yaxshi savol edi, va men ishonaman, ko'p odamlar uchun tushadi. - - bu bizning miyalarimiz uchun ma'lumotlarni qayta ishlashning tabiiy usuli va ishlamayotgani bo'lsa, biz boshini chizishimiz kerak. Bu kabi savollarga kelajakda kelajakdagi ilm-fan odamlari uchun yaxshi joy ajratadi.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba

Sizning fikringizdagi ishlaringiz birlashtirilgan jadvallarni bir-biriga qarashdir va bu ko'rinishda bitta id ustuni mavjud. MySQL bu ko'rinishni pastki tanlov va tabiiy qo'shilish orqali moslashi mumkin.

SELECT * FROM (SELECT * FROM employees NATURAL JOIN people) AS t2 WHERE id=2;

Bu esa, barcha umumiy ustunlarni yiqitib, ularni birlashtirish sharti sifatida ishlatadi. Qaytgan ustunlar umumiy ustunlar tartibida bo'ladi, qolgan ustunlar birinchi jadvalni va qolgan ustunlarni ikkinchi stoldan iborat bo'ladi. Umumiy sütunlarda, agar bir nechta bo'lsa, ularning tartibi ikkinchi stolda boshqacha tartib bo'lsa ham, birinchi stolda bo'lganidek, bir xil bo'ladi.

Bu MySQL-dagi mantiqni sizning fikringizdagi ma'lumotlardan foydalangan holda amalga oshirishga imkon beradi.

ogohlantirish ga bir nechta umumiy ustun bo'lsa, natijalar siz kutgan narsalar bo'lmasligi mumkin. Keyin qo'shilish, har bir ustunni "o'yin" deb hisoblashlari uchun moslashtiradi. Agar ustunlar kalit yaratish uchun birlashtirilsa, bu kutilgan xatti-harakat. Shu bilan birga, bir xil nomdagi ikkita ustun bo'lishi mumkin, lekin kalitning bir qismi bo'lmagan turli xil maqsadlarda foydalanishingiz mumkin bo'lsa, siz bo'sh qator bilan tugashingiz mumkin.

1
qo'shib qo'ydi
NATURAL JOIN - bu javob, rahmat! Buni amalga oshirishim mumkin emas (chunki siz va boshqalar buni kutilmagan xulq-atvorga olib kelishi mumkin, chunki u endi begona so'rovlarni qo'zg'atmaydi), ammo bu savolga javob berganda, siz aniq javob bergansiz. Menga nimadir o'rgatganingiz uchun tashakkur!
qo'shib qo'ydi muallif Bing, manba
Bu juda yaxshi savol edi, va men ishonaman, ko'p odamlar uchun tushadi. - - bu bizning miyalarimiz uchun ma'lumotlarni qayta ishlashning tabiiy usuli va ishlamayotgani bo'lsa, biz boshini chizishimiz kerak. Bu kabi savollarga kelajakda kelajakdagi ilm-fan odamlari uchun yaxshi joy ajratadi.
qo'shib qo'ydi muallif Gypsy Spellweaver, manba

Because the WHERE you are using, isn't the filter only for the table you put after FROM. It will filter the result of those tables.

Siz xohlagan narsalar insonga ham noaniqdir. So'rov siz misol sifatida foydalanganingizdan ko'ra murakkabroq bo'lishi mumkin. va sizning fikringiz bilan disk raskadrovka uchun o'qish osonroq bo'lishi mumkin.

Bundan tashqari WHERE dan so'ng jadvallar bo'yicha tanlov sizga ko'proq moslashuvchanlikni beradi. masalan WHERE employees.id = people.id dan foydalanishingiz mumkin.

va bu turdagi so'rovni PHP kabi biror narsa ichida qanday ishlatish kerak? siz SELECT * FROM dan foydalanmoqdasiz va PHP ichida $ row ['id'] bilan nimani kutmoqdasiz?

Ushbu turdagi tanlash yanada aniqroq so'rovlar va moslashuvchanlik uchun yaxshi bo'ladi va u ham mashina, ham inson uchun noaniqliklarni hal qildi.

0
qo'shib qo'ydi
Bu ijobiy ma'noda nimani anglatadi: Bundan tashqari, WHERE dan so'ng jadvallar bo'yicha tanlov sizga ko'proq moslashuvchanlikni beradi ?
qo'shib qo'ydi muallif Jorge Campos, manba
@JorgeCampos Balki men aqlimda nima bo'lganligi uchun noto'g'ri so'zlarni ishlatgan bo'lardim. Agar siz uni employees.id = people.id orqali filtrlashni istasangiz, uni faqatgina ON da ishlatishingiz mumkin emas. masalan, ... JOIN T2 ON T1barcode = T2.barcode va T1.store = T2.store LEFT JOIN ... bo'lishi mumkin ... ... T2 O'N T1barcode = T2.barcode LEFT JOIN ... qaerda T1.store = T2.store . 2. ba'zida bir xil ustunli bir nechta jadvalga qo'shilamiz, lekin u ustunlar bilan bog'liq emas. Masalan, uchta jadval qo'shildi va biz ... WHERE T1.caption = "nimadir" va T3.caption = "something_else"
qo'shib qo'ydi muallif ICE, manba

Because the WHERE you are using, isn't the filter only for the table you put after FROM. It will filter the result of those tables.

Siz xohlagan narsalar insonga ham noaniqdir. So'rov siz misol sifatida foydalanganingizdan ko'ra murakkabroq bo'lishi mumkin. va sizning fikringiz bilan disk raskadrovka uchun o'qish osonroq bo'lishi mumkin.

Bundan tashqari WHERE dan so'ng jadvallar bo'yicha tanlov sizga ko'proq moslashuvchanlikni beradi. masalan WHERE employees.id = people.id dan foydalanishingiz mumkin.

va bu turdagi so'rovni PHP kabi biror narsa ichida qanday ishlatish kerak? siz SELECT * FROM dan foydalanmoqdasiz va PHP ichida $ row ['id'] bilan nimani kutmoqdasiz?

Ushbu turdagi tanlash yanada aniqroq so'rovlar va moslashuvchanlik uchun yaxshi bo'ladi va u ham mashina, ham inson uchun noaniqliklarni hal qildi.

0
qo'shib qo'ydi
Bu ijobiy ma'noda nimani anglatadi: Bundan tashqari, WHERE dan so'ng jadvallar bo'yicha tanlov sizga ko'proq moslashuvchanlikni beradi ?
qo'shib qo'ydi muallif Jorge Campos, manba
@JorgeCampos Balki men aqlimda nima bo'lganligi uchun noto'g'ri so'zlarni ishlatgan bo'lardim. Agar siz uni employees.id = people.id orqali filtrlashni istasangiz, uni faqatgina ON da ishlatishingiz mumkin emas. masalan, ... JOIN T2 ON T1barcode = T2.barcode va T1.store = T2.store LEFT JOIN ... bo'lishi mumkin ... ... T2 O'N T1barcode = T2.barcode LEFT JOIN ... qaerda T1.store = T2.store . 2. ba'zida bir xil ustunli bir nechta jadvalga qo'shilamiz, lekin u ustunlar bilan bog'liq emas. Masalan, uchta jadval qo'shildi va biz ... WHERE T1.caption = "nimadir" va T3.caption = "something_else"
qo'shib qo'ydi muallif ICE, manba

The simplest answer is that only providing a field reference when MySQL expects a table.field in a WHERE clause when more than one table is being queried is like trying to log into a system without providing your username, only your password. Sorry, your going to have to tell the system who's password you have supplied when you want to log in. Key + Datum = result. Null + Datum = Error.

Buni biroz chuqurroq qilib olsangiz, MySQL JOIN bayonotida ko'rsatilganidek, ikkita jadval o'rtasidagi aloqani o'rnatmaydi. QUERY FINISHES ga qarang. WHERE so'zlari jadvallar birlashtirilganda filtrlanganligiga ishonch hosil qilish uchun ketma-ketlikda qayta ishlanadi. Agar ma'lum bir ID # uchun har ikkala jadvalni ham qidirishni xohlasangiz, u holda sintaksisini kiritishingiz kerak bo'ladi. Bir narsa:

`SELECT * FROM employees FULL JOIN people ON employees.id=people.id WHERE (employee.id = 2 OR people.id = 2)`

Bu esa, to'liq jadvalda bir yoki boshqa stolning umumiy jadvalda mos kelmagani uchun hali ham to'liq ishlaydi, shuning uchun NULL bo'lgan nuqsonli bo'shliqning bo'sh ustunlari bilan natijaga hali ham qo'shiladi.

U erda turli xil JOIN-larda juda ko'p narsa bor, shu jumladan bu SO postidan o'tib, hatto undan oldingi" SO post "da batafsilroq tushuntirilgan.

TL: doktor - Agar siz bitta stol bilan ishlasangiz, MySQL qaerga qarashni biladi. Agar bir nechta stol bilan ishlaganingizda, MySQL sizni chalkashtirib yuboradi va qanday jadval ishlashini aniq bilishi kerak. Nega bu sizni xato qilyapti. Tuzatish oddiy, faqatgina WHERE bandi ostida so'rovga ikkita narsa kiritishingiz kerak:

'SELECT * FROM employees LEFT JOIN people ON employees.id=people.id WHERE employee.id = 2'

LEFTni JOIN-ga qo'shish serverni aktivlarni birlashtirganingiz va ustun nomi bilan jadval nomi qo'shilishi uchun qo'shimcha ko'rsatmalar beradi, u MySQL-ga qarash kerak bo'lgan jadvalni bildiradi.

0
qo'shib qo'ydi

The simplest answer is that only providing a field reference when MySQL expects a table.field in a WHERE clause when more than one table is being queried is like trying to log into a system without providing your username, only your password. Sorry, your going to have to tell the system who's password you have supplied when you want to log in. Key + Datum = result. Null + Datum = Error.

Buni biroz chuqurroq qilib olsangiz, MySQL JOIN bayonotida ko'rsatilganidek, ikkita jadval o'rtasidagi aloqani o'rnatmaydi. QUERY FINISHES ga qarang. WHERE so'zlari jadvallar birlashtirilganda filtrlanganligiga ishonch hosil qilish uchun ketma-ketlikda qayta ishlanadi. Agar ma'lum bir ID # uchun har ikkala jadvalni ham qidirishni xohlasangiz, u holda sintaksisini kiritishingiz kerak bo'ladi. Bir narsa:

`SELECT * FROM employees FULL JOIN people ON employees.id=people.id WHERE (employee.id = 2 OR people.id = 2)`

Bu esa, to'liq jadvalda bir yoki boshqa stolning umumiy jadvalda mos kelmagani uchun hali ham to'liq ishlaydi, shuning uchun NULL bo'lgan nuqsonli bo'shliqning bo'sh ustunlari bilan natijaga hali ham qo'shiladi.

U erda turli xil JOIN-larda juda ko'p narsa bor, shu jumladan bu SO postidan o'tib, hatto undan oldingi" SO post "da batafsilroq tushuntirilgan.

TL: doktor - Agar siz bitta stol bilan ishlasangiz, MySQL qaerga qarashni biladi. Agar bir nechta stol bilan ishlaganingizda, MySQL sizni chalkashtirib yuboradi va qanday jadval ishlashini aniq bilishi kerak. Nega bu sizni xato qilyapti. Tuzatish oddiy, faqatgina WHERE bandi ostida so'rovga ikkita narsa kiritishingiz kerak:

'SELECT * FROM employees LEFT JOIN people ON employees.id=people.id WHERE employee.id = 2'

LEFTni JOIN-ga qo'shish serverni aktivlarni birlashtirganingiz va ustun nomi bilan jadval nomi qo'shilishi uchun qo'shimcha ko'rsatmalar beradi, u MySQL-ga qarash kerak bo'lgan jadvalni bildiradi.

0
qo'shib qo'ydi