MySQL UNION DISTINCT - 排除

时间:2016-04-06 10:08:50

标签: mysql sql

我有这样的查询:

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或具有值 - 此列仅对一种类型的事件(type = 50)具有值,而对于其他事件则为null。

我需要执行以下操作:

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

2 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分:0)

我认为您可以将此作为单个查询执行,并在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的逻辑表明您已在字符串中存储了值列表。这是一个糟糕的选择。