Sql 分类和筛选记录

Sql 分类和筛选记录,sql,filter,sorting,Sql,Filter,Sorting,关于如何以正确的方式对记录列表(来自数据库)进行排序或过滤,是否有任何已知的模式/算法?我目前的尝试涉及使用一个表单,该表单提供一些筛选和排序选项,然后将这些条件和排序算法附加到我现有的SQL中。然而,我发现它很容易被滥用,用户可能会得到他们不应该看到的结果 我正在构建的应用程序是一个调度器,我将所有事件存储在数据库表中。然后,根据用户的级别/角色/权限,将显示不同的数据子集。因此,我的问题可能非常复杂 SELECT * FROM app_event._event_view WHER

关于如何以正确的方式对记录列表(来自数据库)进行排序或过滤,是否有任何已知的模式/算法?我目前的尝试涉及使用一个表单,该表单提供一些筛选和排序选项,然后将这些条件和排序算法附加到我现有的SQL中。然而,我发现它很容易被滥用,用户可能会得到他们不应该看到的结果

我正在构建的应用程序是一个调度器,我将所有事件存储在数据库表中。然后,根据用户的级别/角色/权限,将显示不同的数据子集。因此,我的问题可能非常复杂

SELECT  * 
FROM    app_event._event_view 
WHERE   ((class_id = (SELECT class_id FROM app_event._ical_class WHERE name = 'PUBLIC') AND class_id != (SELECT class_id FROM app_event._ical_class WHERE name = 'PRIVATE') AND class_id != (SELECT class_id FROM app_event._ical_class WHERE name = 'CONFIDENTIAL')) OR user_id = '1') 
        AND calendar_id IN (SELECT calendar_id FROM app_event.calendar WHERE is_personal = 't') 
        AND calendar_id = (SELECT calendar_id FROM app_event.calendar WHERE name = 'personal') 
        AND state_id IN (1,2,3,4,5,6) AND EXTRACT(year FROM dtstart) = '2008' 
        AND EXTRACT(month FROM dtstart) = '11'

由于我更关心的是如何提供正确的信息子集,所以性能目前不是一个主要问题(因为提到的sql是由脚本逐子句生成的)。我正在考虑将所有这些复杂的SQL语句转换为视图,这样生成的SQL不合适的可能性就会减少。

很难理解这个查询,因为我必须大量滚动,而且我不知道数据库

但是,如果权限是“一维”的,例如管理员可以看到所有内容,高级用户可以看到比管理员少的内容,来宾可以看到比高级用户少的内容,等等:您可能可以在事件和用户中都将权限实现为整数,然后

select from event where conditions AND event.privilegue <= user.privilegue

select from event where conditions AND event.privilegue使用ORM工具或使用以下参数:

SELECT  * 
FROM    app_event._event_view 
WHERE
    (
        :p_start_year is null or
        (state_id IN (1,2,3,4,5,6) AND EXTRACT(year FROM dtstart) = :p_start_year)
    )
    and
    (
        :p_date_start is null or
        AND EXTRACT(month FROM dtstart) = :p_date_start
    )

首先,如果使用联接,此查询的外观和性能会更好:

SELECT  * 
  FROM    
    app_event._event_view EV
    INNER JOIN app_event.calendar C
        ON EV.calendar_id = C.calendar.id
    INNER JOIN app_event._ical_class IC
        ON C.class_id = EV.class_id
  WHERE   
    C.is_personal = 't'
    AND C.name = 'personal'
    AND state_id IN (1,2,3,4,5,6) 
    AND EXTRACT(year FROM dtstart) = '2008' 
    AND EXTRACT(month FROM dtstart) = '11'
    AND (
        IC.name = 'PUBLIC' -- other two are redundant
        OR user_id = '1'
        )
这是降低复杂性的良好开端。然后,如果您想直接向SQL添加额外的过滤器,可以在末尾附加更多的“AND…”语句。由于所有条件都与AND相关(OR被安全地包含在括号中),因此不可能有人在这些条件之后添加一个以某种方式撤销上述条件的条件-也就是说,一旦您使用子句的一部分限制了结果,就不能“取消限制”如果它与ANDs串在一起,则在后面加一个子句。(当然,如果这些附加子句靠近用户文本输入,则必须对其进行清理以防止SQL注入攻击。)

一般来说,数据库的过滤速度比任何其他层都快,因为在数据库上使用WHERE子句通常会允许数据库避免甚至从磁盘上读取不必要的记录,这比使用CPU执行的任何操作都要慢几个数量级。DB上的排序通常也更快,因为DB通常可以以这样一种方式进行连接,即记录已经按照您想要的顺序进行排序。因此,在性能方面,如果您能在DB上实现这一点,那就更好了


不过,您说过性能并不是这里的关键,因此在业务逻辑中以编程方式添加过滤器可能对您来说很好,而且比处理SQL字符串更容易阅读。

这里的标准并不是什么大问题,我正在寻找一种更好的过滤和排序方法。。。。在sql查询中,它实际上考虑用户是否可以读取他/她的记录,记录是否在正确的类别中,状态是否正确等等。我认为我不理解您使用过滤的意思,那么。。请解释一下。