MySQL SELECT 来自 1 个表的结果,但根据另一个表排除结果?

Posted

技术标签:

【中文标题】MySQL SELECT 来自 1 个表的结果,但根据另一个表排除结果?【英文标题】:MySQL SELECT results from 1 table, but exclude results depending on another table? 【发布时间】:2010-05-19 04:01:23 【问题描述】:

如果我想从表 'messages' 中获取结果但排除具有字段 messages.message=messages_view.id AND messages.deleted=1 的 'messages_view' 中的值的行,我必须使用什么 SQL 查询AND messages_view.user=$somephp 变量

用更通俗的话来说,我有一个消息表,其中每个 message 都由一个“id”表示,还有一个 messages_view 表与一个“message”字段相连。我想获取 message 中特定“用户”未删除的行(来自 messages_view)。 'deleted'=1 当消息被删除时。

这是我当前的 SQL 查询,它只是从中获取值:

SELECT * FROM messages WHERE ((m_to=$user_id) 
    OR (m_to=0 AND (m_to_state='' OR m_to_state='$state') 
    AND (m_to_city='' OR m_to_city='$city')))

这是我的表格布局:

table: messages
----------------------------
id (INT) (auto increment)
m_from (INT)                     <-- Represents a user id (0 = site admin)
m_to (INT)                       <-- Represents a user id (0 = all users)
m_to_state (VARCHAR)
m_to_city (VARCHAR)

table: messages_view
----------------------------
message (INT)                    <-- Corresponds to messages.id above
user (INT)                       <-- Represents a user id
deleted (INT)                    <-- 1 = deleted

【问题讨论】:

【参考方案1】:

我真的觉得就这么简单:

SELECT * FROM messages WHERE ((m_to=$user_id) 
    OR (m_to=0 AND (m_to_state='' OR m_to_state='$state') 
    AND (m_to_city='' OR m_to_city='$city')))
AND NOT EXISTS (
    SELECT *
    FROM messages_view
    WHERE messages.message = messages_view.id
        AND messages.deleted = 1 
        AND messages_view.user = $somephpvariable
)

【讨论】:

【参考方案2】:
Select ...
From Messages M
Where M.deleted = 0
    And Not Exists  (
                    Select 1
                    From Messages_View MV1
                    Where MV1.message = messages_view.Id
                        And MV1.user = $somephpvariable
                    )

您的第一段和第二段关于您想要删除的标志的内容存在矛盾。

【讨论】:

以上是关于MySQL SELECT 来自 1 个表的结果,但根据另一个表排除结果?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Join 和 Union 组合来自 2 个表的结果 [关闭]

Postgresql - 带有 x 个表的转储数据库 - 仅模式,但来自一个表的数据

mysql三表联查,

如何结合 3 个表的结果来计算 MySql 中的平均分?

3个表的内部连接给出重复的结果

来自连接表的 MySQL 更新语句(受该表的最新值限制)