Way*_*rer 9 php sql inner-join
我正在编写一种旅行"约会"应用程序.
表1:用户
id (key) | gender | pref_m | pref_f
------------------------------------
1 male 1 0
2 male 1 1
表2:乡村选择
id (key) | userid | countryid
------------------------------------
1 1 123
2 1 111
3 1 100
4 1 110
5 2 123
6 2 111
7 2 202
8 2 210
输入:当前用户的用户ID
输出(逻辑):选择的用户ID,并且要为我做的到同一个国家的全体人民的配套的国家,并希望与别人有我的性别去旅行
(加盟)是中选择我显然只需要那些我正在寻找性别的人.
由拥有最多匹配国家/地区的人订购DESC.
$sql = "SELECT userid,count(*) AS matches from countryselection";
这给了我一个列表,列出了所有想要和我一起旅行到同一个国家的人(以及我们有多少个共同国家)
$sql .= " WHERE countryid IN (SELECT countryid FROM countryselection WHERE userid = :userid) GROUP BY userid ORDER BY matches DESC;";
我显然在与性别选择部分斗争.
不确定我是否做了正确的事情以我的方式存储用户选择.
我也可能需要一些指导.
显然 - 谢谢大家.
SELECT
us2.id, -- etc.
COUNT(cs2.countryid) as countries_in_common
FROM
countryselection cs1 -- let's gather user countries he want to visit
LEFT JOIN -- now let's find other users!
countryselection cs2 ON
(
cs2.userid <> :userid AND -- which are not him
cs2.countryid = cs1.countryid -- and want to visit same countries
)
INNER JOIN -- let's grab our user_data
users us1 ON
(
us1.id = cs1.userid
)
INNER JOIN -- and let's grab other user data!
users us2 ON
(
us2.id = cs2.userid
)
WHERE
cs1.userid = :userid AND -- finding our user countries he want to visit
-- final checks
(
(us1.pref_m = 1 AND us2.gender = 'male')
-- he is looking for male and second user is male
OR
(us1.pref_f = 1 AND us2.gender = 'female')
-- he is looking for female and second user is female
) AND
(
(us2.pref_m = 1 AND us1.gender = 'male')
OR
(us2.pref_f = 1 AND us1.gender = 'female')
)
GROUP BY
cs2.userid -- finally group by user_id
Run Code Online (Sandbox Code Playgroud)
最好的是没有子查询,您可以通过多种方式轻松使用此查询.(更改顺序,分组和使用聚合函数)
归档时间: |
|
查看次数: |
419 次 |
最近记录: |