MySQL เข้าร่วมกับส่วนคำสั่งที่


130

ฉันมีสองตารางที่ฉันต้องการเข้าร่วม

ฉันต้องการหมวดหมู่ทั้งหมดในตารางหมวดหมู่และหมวดหมู่ทั้งหมดที่สมัครใช้งานโดยผู้ใช้ในตารางหมวดหมู่_subscriptions

เป็นหลักนี้คือแบบสอบถามของฉันจนถึง:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

ใช้งานได้ดี แต่ฉันต้องการเพิ่มส่วนคำสั่งที่ส่วนท้ายของแบบสอบถามซึ่งทำให้การเข้าร่วม / equi ภายในเป็นหลัก

   SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1

ฉันจะรับหมวดหมู่ทั้งหมดตลอดจนหมวดหมู่ทั้งหมดที่สมัครรับข้อมูลโดยผู้ใช้รายใดรายหนึ่งโดยใช้คำค้นหาเดียวได้อย่างไร

category_id เป็นกุญแจสำคัญในตารางหมวดหมู่และ user_category_subscriptions user_id อยู่ในตาราง user_category_subscriptions

ขอบคุณ


ฉันเชื่อว่ามันถูกเรียกว่า 'เข้าร่วมถูกต้อง' หากฉันไม่เข้าใจผิด
Tyler Carter

@TylerCarter คุณเข้าใจผิดอย่างแน่นอน :)
Scooter Daraf

คำตอบ:


287

คุณต้องใส่ไว้ในjoinประโยคไม่ใช่where:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id
    and user_category_subscriptions.user_id =1

ดูด้วยการinner joinใส่ประโยคในjoinหรือwhereเทียบเท่า อย่างไรก็ตามด้วยความouter joinแตกต่างอย่างมากมาย

ตามjoinเงื่อนไขคุณระบุ rowset ที่คุณจะเข้าร่วมกับตาราง ซึ่งหมายความว่ามันประเมินuser_id = 1ครั้งแรกและใช้เวลาส่วนหนึ่งของuser_category_subscriptionsที่มีuser_idของที่จะเข้าร่วมกับทุกแถวใน1 categoriesสิ่งนี้จะทำให้คุณทุกแถวในcategoriesขณะcategoriesที่เฉพาะผู้ใช้นี้ได้สมัครเป็นสมาชิกจะมีข้อมูลใด ๆ ในuser_category_subscriptionsคอลัมน์ แน่นอนว่าทั้งหมดcategoriesจะมีประชากรอยู่nullในuser_category_subscriptionsคอลัมน์

ในทางกลับกันwhereประโยคจะเข้าร่วมแล้วลด rowset ดังนั้นนี้ไม่ทั้งหมดร่วมแล้วช่วยขจัดทุกแถวที่ไม่เท่ากับuser_id คุณกำลังทิ้งให้อยู่กับวิธีที่ไม่มีประสิทธิภาพที่จะได้รับ1inner join

หวังว่านี่จะช่วยได้!


2
ใส่คำถามอย่างดีและตอบอย่างดี! บันทึกเวลาของฉัน ขอบคุณมาก!
Gaurav Phapale

1
ฉันรักคุณมาก ๆ เอริคคุณช่วยฉันจากการร้องไห้: D
Raheel

ในทางตรงกันข้ามถ้าฉันต้องการผลิตข้อมูลที่สะอาดสำหรับผู้ใช้วิธีที่สอง (ที่) มีความเหมาะสมมากกว่า ถูกต้องหรือไม่
vlr

1
สวัสดีเราสามารถ chuck user_category_subscriptions.user_id เป็นโมฆะ เพื่อดึงรหัสรายละเอียดในตารางที่มีรหัสเป็นโมฆะในตาราง B
Veeresh123

@ Veeresh123 สิ่งที่AและBตาราง? คุณสามารถเรียบเรียงคำถามใหม่ได้หรือไม่?
Istiaque Ahmed

11

ลองสิ่งนี้

  SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1 
          or user_category_subscriptions.user_id is null

หากฉันยังคงได้รับข้อผิดพลาดเดียวกันโดยใช้รหัสนี้ฉันจะค้นหาอะไรต่อไป
แจ็คฟรานเซ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.