SQL语句我无法绕过脑袋(大脑太小)

Way*_*rer 9 php sql inner-join

我正在编写一种旅行"约会"应用程序.

  • 用户注册自己
  • 用户告诉应用程序他们是男性还是女性
  • 用户告诉应用他们想访问哪些国家/地区
  • 用户告诉应用程序他们是否想要与男性(pref_m = 1)或女性(pref_f = 1)一起旅行

我的桌子

表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

那么select语句必须做什么

输入:当前用户的用户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;";
这给了我一个列表,列出了所有想要和我一起旅行到同一个国家的人(以及我们有多少个共同国家)

最后的说明

我显然在与性别选择部分斗争.
不确定我是否做了正确的事情以我的方式存储用户选择.
我也可能需要一些指导.


显然 - 谢谢大家.

Pet*_*ter 8

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)

最好的是没有子查询,您可以通过多种方式轻松使用此查询.(更改顺序,分组和使用聚合函数)