我有这样的查询:
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 列),并收集该事件。是否可以进行此类查询?
答案 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
的逻辑表明您已在字符串中存储了值列表。这是一个糟糕的选择。