[SQL ] 关于 再排序 与 效率 的问题

楼主: vvrr (vvrr)   2013-11-22 18:21:49
最近开始接触MySQL,遇到了两个问题。
====== 主要设定 ======
主要的表格有两个,一个记录使用者出没的日期:
Table_log:
uid date_time
A00001 20131105
A00002 20131106
A00001 20131107
A00003 20131108
... ...
一个记录使用者的性别:
Table_sex
uid sex
A00001 0
A00002 0
A00003 1
... ...
我希望能给定一段日期,查询这段日期内使用者出现的次数并排序。
SELECT Table_log.uid, Table_sex.sex, COUNT(*)
FROM Table_log, Table_sex
WHERE (date_time >= 20131105 AND date_time <= 20131107 AND
Table_log.uid = Table_sex.uid)
GROUP by Table_log.uid
ORDER BY COUNT(*) DESC
LIMIT 100;
这段指令是可以正常执行的。以下是我的问题。
==== 问题 =====
1. 关于效率。
我看到一些讨论与文章提到“INNER JOIN 的效率会高于 子查询”。
想请问的是像我这种写在 WHERE 里面的,类似子查询的方法效率会比INNER JOIN差吗
因为前人留下来的方法是INNER JOIN,但是希望能用简单一点的写法完成。
2. 关于排序。
上面执行的结果会是
uid sex COUNT(*)
A00001 0 20
A00003 1 15
A00004 0 3
A00008 1 2
有100行,照着COUNT(*)排序。
现在我希望这100行能照着 sex(性别) 排序,想到方法是类似:
SELECT * IN (
SELECT Table_log.uid, Table_sex.sex, COUNT(*)
FROM Table_log, Table_sex
WHERE (date_time >= 20131105 AND date_time <= 20131107 AND
Table_log.uid = Table_sex.uid)
GROUP by Table_log.uid
ORDER BY COUNT(*) DESC
LIMIT 100
}
ORDER BY sex;
的感觉,但是这样子没办法顺利执行(语法有错)。
想请问MySQL有这种用法吗?或是我希望的做法有其他方式可以达成呢?
谢谢
作者: bohei (run and fall)   2012-01-22 18:42:00
ㄟ..感觉有蛮多错误的
楼主: vvrr (vvrr)   2012-01-22 18:49:00
@@"我再检查看看…因为原本的table比较大,我把无关的拿掉了y
作者: rockchangnew (rock)   2012-01-23 00:44:00
你的写法并不是子查询,是简化Inner Join的语法
作者: KC73 (肯先生)   2012-01-23 14:36:00
先用 explain 看看吧

Links booklink

Contact Us: admin [ a t ] ucptt.com