php - 如果在其他表中为 Y,则从 SQL 中排除结果

标签 php mysql json

我的数据库中有一个用户列表,如果用户被禁止,我还有另一个表...

我需要帮助来调整我的 sql 查询,这样如果用户在 ban 表中,他们将被排除在 sql 结果之外

tbl_ban_user    
banID user_id nickname isBan date_ban   ban_cause
98    32      Michael  Y     2016-03-11 whatever reason
99    84      Joe      Y     2016-03-11 whatever reason



tbl_users
user_id nickname is_private verified etc..
32      Michael  N          Y    
84      Joe      N          Y    

这是我的 sql 查询,然后输出 JSON,

public function fetchUsers($keyword, $user_id, $who = 0, $who_nickname = '') {
        $sql = "SELECT
                A.*,
                SUM(IF(D.grader_id='$user_id', 0, 1)) AS ungraded_count,
                ROUND(AVG(D.grader_value),0) as avg_grade,
                COUNT(DISTINCT B.grader_id) as grading,
                COUNT(DISTINCT E.grade_id) as graders,
                COUNT(DISTINCT C.photo_id) as photos,
                SUM(IF(B.grader_id='$user_id', 1, 0)) AS is_graded,
                SUM(IF(B.grader_id='$user_id', B.notification, 0)) AS notification
                FROM
                tbl_users A
                LEFT JOIN
                tbl_grade B ON (A.user_id = B.grade_id AND B.grade_type=2)
                LEFT JOIN
                tbl_photo C ON (A.user_id = C.user_id)
                LEFT JOIN
                tbl_grade D ON (C.photo_id=D.grade_id AND D.grade_type=1)
                LEFT JOIN
                tbl_grade E ON (A.user_id = E.grader_id AND E.grade_type=2)
                WHERE
                A.verified = 'Y' AND 
                A.user_name LIKE '%$keyword%'
                 AND A.user_id <> '$user_id' " . ($who == 0 ? '' : " AND A.user_id = '$who'") . ($who_nickname == '' ? '' : " AND A.nickname = '$who_nickname'") . "

                GROUP BY A.user_id
                ORDER BY A.user_name";

        return $this->db->query($sql)->result();
    }

所以基本上我希望从结果中排除 tbl_ban_user 中列出的任何用户,我该如何编码?

谢谢你的帮助

最佳答案

可能最快的方法是这样的:

public function fetchUsers($keyword, $user_id, $who = 0, $who_nickname = '') {
        $sql = "SELECT
                A.*,
                SUM(IF(D.grader_id='$user_id', 0, 1)) AS ungraded_count,
                ROUND(AVG(D.grader_value),0) as avg_grade,
                COUNT(DISTINCT B.grader_id) as grading,
                COUNT(DISTINCT E.grade_id) as graders,
                COUNT(DISTINCT C.photo_id) as photos,
                SUM(IF(B.grader_id='$user_id', 1, 0)) AS is_graded,
                SUM(IF(B.grader_id='$user_id', B.notification, 0)) AS notification
                FROM
                tbl_users A
                LEFT JOIN
                tbl_grade B ON (A.user_id = B.grade_id AND B.grade_type=2)
                LEFT JOIN
                tbl_photo C ON (A.user_id = C.user_id)
                LEFT JOIN
                tbl_grade D ON (C.photo_id=D.grade_id AND D.grade_type=1)
                LEFT JOIN
                tbl_grade E ON (A.user_id = E.grader_id AND E.grade_type=2)
                WHERE
                A.verified = 'Y' AND 
                A.user_name LIKE '%$keyword%'
                 AND A.user_id <> '$user_id' " . ($who == 0 ? '' : " AND A.user_id = '$who'") . ($who_nickname == '' ? '' : " AND A.nickname = '$who_nickname'") . "
                AND A.user_id NOT IN(SELECT DISTINCT(user_id) FROM tbl_ban_user)

                GROUP BY A.user_id
                ORDER BY A.user_name";

        return $this->db->query($sql)->result();
    }

另一种方式是:

public function fetchUsers($keyword, $user_id, $who = 0, $who_nickname = '') {
        $sql = "SELECT
                A.*,
                SUM(IF(D.grader_id='$user_id', 0, 1)) AS ungraded_count,
                ROUND(AVG(D.grader_value),0) as avg_grade,
                COUNT(DISTINCT B.grader_id) as grading,
                COUNT(DISTINCT E.grade_id) as graders,
                COUNT(DISTINCT C.photo_id) as photos,
                SUM(IF(B.grader_id='$user_id', 1, 0)) AS is_graded,
                SUM(IF(B.grader_id='$user_id', B.notification, 0)) AS notification
                FROM
                tbl_users A
                LEFT JOIN
                tbl_grade B ON (A.user_id = B.grade_id AND B.grade_type=2)
                LEFT JOIN
                tbl_photo C ON (A.user_id = C.user_id)
                LEFT JOIN
                tbl_grade D ON (C.photo_id=D.grade_id AND D.grade_type=1)
                LEFT JOIN
                tbl_grade E ON (A.user_id = E.grader_id AND E.grade_type=2)
                LEFT JOIN
                tbl_bar_user F ON F.user_id = A.user_id
                WHERE
                A.verified = 'Y' AND 
                A.user_name LIKE '%$keyword%'
                 AND A.user_id <> '$user_id' " . ($who == 0 ? '' : " AND A.user_id = '$who'") . ($who_nickname == '' ? '' : " AND A.nickname = '$who_nickname'") . "
                AND F.isBan <> 'Y'

                GROUP BY A.user_id
                ORDER BY A.user_name";

        return $this->db->query($sql)->result();
    }

您可以对两者进行测试,看看哪个更适合您的数据集/编码偏好。

关于php - 如果在其他表中为 Y,则从 SQL 中排除结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35949782/

相关文章:

PHP 字符串与 Mysql 的比较 Like %

mysql - 内部联接为其中 1 个字段返回错误值

php - 修改存储在 Table Column 中的 JSON 字符串的属性值

php - 意外的 T_ECHO 警告?

php - jQuery - Easyslider Internet Explorer

php - Symfony - 如何添加未嵌入基础对象的表单字段

mysql - 如何检查给定的数据是否存在于另一个MySql表中?

php - 使用 PHP 上传多个图像并将条目提交到 mysql

javascript - 如何使 REST 调用安全

c# - 使用数据契约的空字符串序列化