我必须使用表格 表A
id | title | content
表B
id | id_from_table_a | user_id | already_seen
我无法找到对mysql的好查询,它将显示如下内容:
show all from table A whitout where user_id='user_logged_id' and already_seen='yes'
上面的伪代码
它是一个大数据库,所以join的意志可能是一个更好的解决方案。
答案 0 :(得分:2)
这是在没有加入的情况下完成的:
select * from tableA where id not in
(select id_from_table_a from tableB where user_id='user_logged_id' and already_seen='yes')
或加入:
select a.id, a.tittle, a.content from tableA a left join tableB b
on a.id = b.id_from_table_a
where b.user_id <> 'user_logged_id' and b.already_seen <> 'yes'
group by a.id, a.tittle, a.content
答案 1 :(得分:0)
不确定whitout
的含义,但您可以根据拼写错误更改查询。我相信你正在寻找的是这样的东西吗?
SELECT * FROM TableA as a
JOIN TableB as b ON a.id = b.id_from_table_a
WHERE
b.user_id = 'user_logged_in' AND b.already_seen = 'yes';
答案 2 :(得分:0)
SELECT * FROM tableA
JOIN TableB
ON tableA.id = TableB.tableA-id
WHERE already-seen = "yes" AND user-id != :user-logged-id
答案 3 :(得分:0)
我如何加入2桌
SELECT * FROM TableA
INNER JOIN TableB on TableA.id=TableB.id_from_table_a
and TableB.user_id='user_logged_id'
and TableB.already_seen='yes'
答案 4 :(得分:0)
使用反连接模式返回指定结果的查询示例:
SELECT a.id
, a.title
, a.content
FROM table_a a
LEFT
JOIN table_b b
ON b.id_from_table_a = a.id
AND b.already_seen = 'yes'
AND b.user_id = 'user_logged_in'
WHERE b.already_seen IS NULL
让我们解开一点。
我们从table_a返回所有行,以及&#34;匹配&#34; table_b中的行。要被视为&#34;匹配&#34;,该行必须满足ON子句中的谓词(id_from_table_a
列必须匹配,already_seen
和user_id
列必须满足条件。
LEFT JOIN
是外部联接。它返回左侧表中的所有行(满足WHERE子句中的谓词),并返回右侧表中的匹配行。 (在正常的内部联接中,table_a中没有来自table_b的匹配行的行被排除。使用外部联接,没有匹配的行< em>将返回。)
&#34;技巧&#34;是排除具有匹配项的行。我们在这里使用WHERE
子句中的谓词(条件)。我们正在测试一个我们知道匹配行上将为非NULL的列。 (来自table_b的任何匹配行将具有already_seen
列的非NULL值,我们保证通过ON
子句中的条件...匹配的行都将具有值{{对于already_seen列。(我们可以引用table_b中保证为非null的任何列...如果table_b中的'yes'
列被定义为NOT NULL或者是PRIMARY KEY,我们可以用那个。)
对于id
中没有匹配行的行,我们知道table_a
列将为already_seen
。因此,我们排除所有匹配的行,只留下table_a中没有匹配的行。
<强>后续强>
问:这种反连接是否会提供比正常更快的结果,其中b.user_id&lt;&gt; &#39; user_logged_id&#39;和b.already_seen&lt;&gt; &#39;是&#39; ? - Color Dalnet 5分钟前
A:反连接将提供不同的结果,而不是检查table_b中列的不等于条件的查询。那些测试会否定&#34;外在性&#34;一个NULL
,使其等同于LEFT JOIN
。反连接模式将返回指定的结果,table_a中的行没有&#34;匹配&#34; table_b中的一行。
就性能而言,反连接通常是最有效的,尽管其他查询模式可以同样快。 (对于返回相同结果的其他一些查询模式,执行计划是相同的。其他语句可以有不同的执行计划,这些通常较慢,但在某些情况下它们实际上更快。)
作为另外两种模式的示例,INNER JOIN
谓词...(请注意,我们需要保证NOT IN
值不包含在返回的集合中子查询。)
NULL
为了完整起见,返回等效结果的SELECT a.id
, a.title
, a.content
FROM table_a a
WHERE a.id NOT IN
( SELECT b.id_from_table_a
FROM table_b b
WHERE b.already_seen = 'yes'
AND b.user_id = 'user_logged_in'
AND b.id_from_table_a IS NOT NULL
)
相关子查询模式的示例:
NOT EXISTS
您可以检查SELECT a.id
, a.title
, a.content
FROM table_a a
WHERE NOT EXISTS
( SELECT 1
FROM table_b b
WHERE b.already_seen = 'yes'
AND b.user_id = 'user_logged_in'
AND b.id_from_table_a = a.id
)
的输出,以查看每个语句的实际执行计划。根据MySQL的版本,执行计划可能相同或可能不同。 &#34;优化器&#34; (负责将SQL文本转换为执行计划的MySQL代码部分)在某些主要版本中发生了一些重大变化。)