当我运行“高级搜索”查询时,我希望能够知道每行返回的符合条件数。例如,在这个查询中,我得到名字以“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)告诉我如何实现这一目标。
由于
答案 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