查询仅排除许多预期行中的1个

时间:2018-10-13 18:12:57

标签: php mysql

我正在执行用户搜索,但想排除所有阻止搜索者的用户。这是我到目前为止的内容,但结果中始终包含除一个阻止的用户之外的所有用户。我已经尝试了几种组合,但不确定如何解决。我还考虑过拆分查询,并使用PHP过滤掉block表中的用户。

结果应仅返回iosuser1。

> +----------+---------+-----------+
|username  |zipcode  |birthdate  |
+----------+---------+-----------+
|tester55  |72758    |1999-09-09 |
+----------+---------+-----------+
|tester86  |60608    |1983-05-10 |
+----------+---------+-----------+
|iosuser1  |10011    |1975-12-19 |
+----------+---------+-----------+
|iosuser5  |10011    |1975-12-21 |
+----------+---------+-----------+


Blocks table
+----------+---------+-----------+
|blocker   |blockeduser
+----------+---------+-----------+
|tester86  |tester55 |          |
+----------+---------+-----------+
|iosuser5  |tester55 |         |
+----------+---------+-----------+

Zip Code table
+----------+---------+-----------+
|zipcode   |city
+----------+---------+-----------+
|72758     |Rogers   |          |
+----------+---------+-----------+
|60608     |Chicago  |         |
+----------+---------+-----------+
SELECT
zipcodes.zip,
zipcodes.city,
zipcodes.state,
users.*,
YEAR(CURRENT_TIMESTAMP) - YEAR(users.birthdate) -(
    RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(users.birthdate, 5)
) AS age, blocks.blockeduser, blocks.blocker,
center.seekingdistance,
(
    3959 * ACOS(
        COS(RADIANS(zipcodes.latitude)) * COS(RADIANS(center.latitude)) * COS(
            RADIANS(zipcodes.longitude) - RADIANS(center.longitude)
        ) + SIN(RADIANS(zipcodes.latitude)) * SIN(RADIANS(center.latitude))
    )
) AS distance
FROM
    (
        (
        SELECT
            users.username,
            users.zip,
            users.seekingdistance,
            users.seekingGender AS wantgender,
            users.seekingrace AS wantrace,
            users.seekingmarital AS wantmarital,
            users.seekingminage AS wantminage,
            users.seekingmaxage AS wantmaxage,
            users.seekingminheight AS wantminheight,
            users.seekingmaxheight AS wantmaxheight,
            users.seekingbodytype AS wantbodytype,
            users.seekingreligion AS wantreligion,
            users.seekingeducation AS wanteducation,
            users.seekingoccupation AS wantoccupation,
            users.seekingpolitics AS wantpolitics,
            users.seekingkids AS havekids,
            users.seekingwantkids AS wantwantkids,
            users.seekingdrink AS wantdrinker,
            users.seekingsmoke AS wantsmoker,
            users.gender AS mygender,
            zipcodes.latitude,
            zipcodes.longitude
        FROM
            (
                users
            JOIN zipcodes ON users.zip = zipcodes.zip
            )
        WHERE
            (username = 'tester55')
    ) center,
    zipcodes, blocks
    )
INNER JOIN users ON zipcodes.zip = users.zip
WHERE
    (
        users.username <> 'tester55' AND users.birthdate >= DATE_SUB(
            NOW(), INTERVAL wantmaxage YEAR) AND users.birthdate <= DATE_SUB(
                NOW(), INTERVAL wantminage YEAR) 
            ) AND NOT IN (SELECT blocks.blocker from blocks INNER JOIN users on users.username = blocks.blocker WHERE blocks.blockeduser = "tester55" and blocks.blocker = "tester86")
        HAVING
            (
                distance < center.seekingdistance
            ) 
        ORDER BY
            distance

0 个答案:

没有答案