如何使用MySQL视图和ORDER BY子句?

时间:2012-12-23 04:37:11

标签: mysql sql-order-by

问题#1 - 如何查看table1,如果table2中的某个字段存在于table2中,那么从视图中排除该记录?

问题#2 - 如何按表1中的id以DESC顺序排序结果。

SELECT table1.source_id
FROM table1
WHERE table1.source_id NOT IN (SELECT table2.source_id from table2)
ORDER BY table1.source_id DESC;

4 个答案:

答案 0 :(得分:1)

我不知道,你在说什么,但从你的问题我得出结论。 假设AB是两个表,其公共字段为fee_id。 然后尝试一下。

select a.name,b.fee_id from A a,B a where a.fee_id=b.fee_id

上面的查询将通过检查两个表中的fee_id来返回两个表中的所有数据。

现在,如你所说,你需要ORDER BY。然后,做一些像。

select a.name,b.fee_id from A a,B a where a.fee_id=b.fee_id ORDER BY a.name DESC

如果您想以DESC名称的顺序显示您的信息。

<强>更新

如何制作视图

create view viewname as (select * from table1)

解决您的第一个问题

假设name字段在两个表之间很常见,并且您希望该视图中的那些记录在两个表中都是 UNIQUE 。我的意思是,如果table1有一条记录,但table2

中没有相同的记录

create view viewname as (select * from table2 UNION (select * from table1 where name not in(select name from table2)))

示例:

NAME |                    NAME |
-------------            ----------------
ABC  |                   ABC   |
CDF  |                   GHI   |

It will return 

NAME |                    
-------------            
ABC  |                   
CDF  |     
GHI  |

解决第二个问题

您在问题中提供了此查询。而且,我觉得没有任何错误。

SELECT source_id
FROM table1
WHERE source_id NOT IN (SELECT source_id from table2)
ORDER BY source_id DESC;

答案 1 :(得分:1)

我建议你使用“反连接”模式。这是一个带有谓词的LEFT JOIN,它排除了匹配的任何行,

SELECT t1.source_id
  FROM table1 t1
  LEFT JOIN table2 t2
    ON t2.source_id = t1.source_id 
 WHERE t2.source_id IS NULL
 ORDER
    BY t1.source_id DESC

(如果table1上的索引是一个带有source_id前导列的table2,则此语句的性能最佳。)

另一种方法是使用NOT EXISTS谓词

SELECT t1.source_id
  FROM table1 t1
 WHERE NOT EXISTS 
       ( SELECT 1
           FROM table2 t2
          WHERE t2.source_id = t1.source_id
       )
 ORDER
    BY t1.source_id DESC

(MySQL优化器也可以将其作为“反连接”运行,而不是作为依赖子查询运行;您需要检查EXPLAIN的输出以进行验证。)

在大型集合中,其中任何一个都比包含派生表的查询(例如带有NOT IN (subquery)谓词的查询表现得更好。

答案 2 :(得分:0)

使用LEFT JOIN获取fee_source表或a_aif表中未找到的a_proxy UNION(隐式不同)或{ {1}},然后你可以在它的末尾添加UNION ALL子句,如下所示:

ORDER BY

SQL Fiddle Demo

答案 3 :(得分:0)

我使用OFFSET 0 ROWS来强制order by子句

select count(*) from (
select column_name 
from table_A
order by column_name OFFSET 0 ROWS) abc