看板 Database 關於我們 聯絡資訊
最近開始接觸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有這種用法嗎?或是我希望的做法有其他方式可以達成呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.31.103
bohei:ㄟ..感覺有蠻多錯誤的 11/22 18:42
vvrr:@@"我再檢查看看…因為原本的table比較大,我把無關的拿掉了y 11/22 18:49
rockchangnew:你的寫法並不是子查詢,是簡化Inner Join的語法 11/23 00:44
KC73:先用 explain 看看吧 11/23 14:36