MySQL UNION DISTINCT - exclude



我有这样的查询:

SELECT cs_event.*, cs_file.name, cs_file.extension, cs_user.first_name, cs_user.last_name
FROM cs_event
LEFT JOIN cs_file ON cs_event.idfile = cs_file.idfile
LEFT JOIN cs_user ON cs_event.iduser = cs_user.iduser
WHERE type !=  51
AND idportal = 1
UNION DISTINCT
SELECT cs_event.*, cs_file.name, cs_file.extension, cs_user.first_name, cs_user.last_name
FROM cs_event
LEFT JOIN cs_file ON cs_event.idfile = cs_file.idfile
LEFT JOIN cs_user ON cs_event.iduser = cs_user.iduser
WHERE shared_with_users LIKE  '%i:2;%'
AND idportal = 1
ORDER BY add_date DESC
LIMIT 6

问题如下:

普通用户看不到某些类型的事件(目前是51类型),他只能看到与他共享的东西。

shared_with_users列可以为null或有值-此列仅对一种类型的事件(类型=50)有值,对其他事件则为null。

我需要执行以下操作:

用户可以访问除类型为51的事件之外的所有事件,如果事件类型为50,我需要检查该事件是否与他共享(shared_with_users列),并收集该事件。有可能进行这种查询吗?

试试这个

SELECT cs_event.*, cs_file.name, cs_file.extension, cs_user.first_name, cs_user.last_name
FROM cs_event
LEFT JOIN cs_file ON cs_event.idfile = cs_file.idfile
LEFT JOIN cs_user ON cs_event.iduser = cs_user.iduser
WHERE type !=  51 o or (type =  50 and shared_with_users LIKE  '%i:2;%')
AND idportal = 1
ORDER BY add_date DESC
LIMIT 6

我认为您可以通过WHERE子句中的逻辑将其作为单个查询来完成:

SELECT e.*, f.name, f.extension, u.first_name, u.last_name
FROM cs_event e LEFT JOIN
     cs_file f
     ON e.idfile = f.idfile LEFT JOIN
     cs_user u
     ON e.iduser = u.iduser
WHERE idportal = 1 AND
      (type <> 51 OR shared_with_users LIKE  '%i:2;%');

一些注意事项:

  • 我认为LEFT JOIN没有必要。WHERE子句可能会将它们变成内部联接,但如果没有限定的列名,就很难判断
  • 我添加了表别名,这样查询更易于编写和读取
  • shared_with_users的逻辑表明您已将值列表存储在字符串中。这是一个糟糕的选择

最新更新