最近开始接触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有这种用法吗?或是我希望的做法有其他方式可以达成呢?
谢谢