[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