MYSQL从两个表中选择

时间:2015-01-29 00:05:40

标签: php mysql

我必须使用表格 表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的意志可能是一个更好的解决方案。

5 个答案:

答案 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_seenuser_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代码部分)在某些主要版本中发生了一些重大变化。)

相关问题