获得满足标准的数量

时间:2017-06-02 20:47:40

标签: mysql join inner-join

当我运行“高级搜索”查询时,我希望能够知道每行返回的符合条件数。例如,在这个查询中,我得到名字以“A”开头,姓氏以“B”开头的人:

select case when (u.firstname like "A%") then 1 else 0 end + case when (u.lastname like "B%") then 1 else 0 end as criteria_nb, u.ID, firstname, lastname, picture from Users u where u.firstname like "A%" or u.lastname like "B%";

这是我的表用户的样子

 ID
 firstname
 lastname
 picture
 nbr_children

这很好用。我只需要通过 criteria_nb 订购结果,我会先得到满足这两个要求的用户,然后只满足一个要求。

现在的问题是如何在多个表上执行此操作。在这里,我试图让用户有0到10个孩子,至少有一个孩子在2017年出生。我有一个名为“User_children_years_of_birth”的表,如下所示:

| Field         | Type    | Null | Key | Default | Extra |
| user_id       | int(11) | YES  |     | NULL    |       |
| year_of_birth | int(11) | YES  |     | NULL    |       |

我首先尝试过这个:

 select case when (u.children_nbr >= 0 and u.children_nbr <= 10) then 1 else 0 end + case when ((yob.user_id = u.id and (yob.year_of_birth=2017))) then 1 else 0 end as nb_criteres, u.ID, firstname, lastname, picture from Users u  join User_children_years_of_birth yob on (yob.user_id = u.id and (yob.year_of_birth=2017)) where (u.children_nbr >= 0 and u.children_nbr <= 10);

这不起作用。 INNER JOIN将使查询返回符合BOTH条件的用户。所以我正在尝试使用这种语法(实际上我最喜欢的)

 select case when (u.children_nbr >= 0 and u.children_nbr <= 10) then 1 else 0 end + case when ((yob.user_id = u.id and (yob.year_of_birth=2017))) then 1 else 0 end as nb_criteres, u.ID, firstname, lastname, picture from Users u, User_children_years_of_birth yob where (u.children_nbr >= 0 and u.children_nbr <= 10) or (yob.user_id = u.id and (yob.year_of_birth=2017));  

这会返回重复的结果,我不明白为什么。但是我可以看到,如果用户满足这两个条件,它们将以“2”显示为nb_criteria,然后将“1”显示为nb_criteria。

现在我真的很困惑,因为首先我认为这两个JOIN语法是等价的。那你能不能

1)向我解释这些结果

2)向我解释两种语法之间的区别

3)告诉我如何实现这一目标。

由于

1 个答案:

答案 0 :(得分:0)

这种结构可以帮助你

要检查至少1名2017年出生的孩子

有计数 - 孩子的数量最多10

SELECT ...
From table1 ...
Join table2 ...
Join table3 ...
Where ....
Exists( select 1 from tableforgettingkids where parent = mainqueryparentid and birthdateyear = 2017)
Group by ...
Having count(noofkids) < 11