简体   繁体   English

如何连接表并在mysql中定义更多条件

[英]how to join tables and defined more conditions in mysql

I have two tables: courses and courses_partners . 我有两个表: coursescourses_partners In my courses table I have attributes of each course. 在我的courses表中,我具有每门课程的属性。 In courses_partners there are only two attributes: courses_partners中,只有两个属性:

course_id(foreign key to courses table)
partner_id(foreign key to partners table).

I want to select all courses , on which are joined exactly 8 partners(where num rows in courses_partners for one course_id is 8 (8 is number readed from courses.maxAmount attribute)). 我想选择所有courses ,在其上加入了正好8个合作伙伴(其中NUM行courses_partners一个course_id是8(8是readed数courses.maxAmount属性))。 How to do it? 怎么做? I have something like this, but this not working: 我有这样的事情,但这不起作用:

SELECT courses_partners.course_id, courses.title, courses.maxAmount FROM 
courses_partners RIGHT JOIN courses ON 
(courses_partners.course_id=courses.course_id) GROUP BY
courses_partners.course_id HAVING COUNT(*) < courses.maxAmount

You can use: 您可以使用:

SELECT *
FROM courses AS c
WHERE course_id IN (SELECT course_id
                    FROM courses_partners                    
                    GROUP BY course_id
                    HAVING COUNT(*) < c.maxAmount)

This will select all courses having less than maxAmount references to courses_partners table. 这将选择所有对courses_partners表的引用少于 maxAmount课程。

If you want those references to contain less than maxAmount records with distinct partner_id, then use this HAVING clause instead: 如果您希望这些引用包含少于 maxAmount具有不同 partner_id的记录,请改用此HAVING子句:

HAVING COUNT(DISTINCT partner_id) < c.maxAmount

Demo here 在这里演示

Alternatively you can use a LEFT JOIN : 另外,您可以使用LEFT JOIN

SELECT c.*
FROM courses AS c
LEFT JOIN (
  SELECT course_id, COUNT(*) AS cnt
  FROM courses_partners                    
  GROUP BY course_id
) AS cp ON c.course_id = cp.course_id AND
           c.maxAmount < cp.cnt                    

This will also return courses having no referencing records in courses_partners at all. 这也将返回courses中没有引用记录courses_partners可言。

Demo here 在这里演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM