坚持使用复杂的MySQL查询语法(将表连接到自身?)

时间:2014-07-20 11:17:26

标签: mysql sql join

我在MySQL表中有一些语言数据,包含大约380万行(几乎所有字段都有索引):

+---------+-----------+----------+--------+----------------+----------+--------+---------+---------+
| theWord | lcTheWord | spelling | thePOS | theUSAS        | register | period | variety | theDate |
+---------+-----------+----------+--------+----------------+----------+--------+---------+---------+
| to      | to        | l        | TO     | Z5             | p        |      1 | b       |    1608 |
| direct  | direct    | l        | VVI    | M6             | p        |      1 | b       |    1608 |
| others  | others    | l        | NN2    | A6.1-/Z8       | p        |      1 | b       |    1608 |
| .       | .         | o        | .      | PUNC           | p        |      1 | b       |    1608 |
| Both    | both      | u        | DB2    | N5             | p        |      1 | b       |    1608 |
| his     | his       | l        | APPGE  | Z8m            | p        |      1 | b       |    1608 |
| eyes    | eyes      | l        | NN2    | B1             | p        |      1 | b       |    1608 |
| are     | are       | l        | VBR    | A3+            | p        |      1 | b       |    1608 |
| never   | never     | l        | RR     | T1/Z6          | p        |      1 | b       |    1608 |
| at      | at        | l        | RR21   | N3.8+[i281.2.1 | p        |      1 | b       |    1608 |

因此,同一个词可以(并且经常会)多次包含在表中,其中一些用" l"对于小写,有些用" u"为大写。

我现在想比较不同时期(例如1对8),多样性(" b" =英国英语," a" =美式英语)中单个词的大小写通过创建按大小写拼写比例排名的输出。我将在某个阶段也想将数据限制为某些词性标签(thePOS)或语义标签(theUSAS)。

不幸的是,我对SQL的了解非常有限 - 尽管我已经尝试过很多东西(比如加入桌子并尝试从那里开始做事),但到目前为止,我已经失败了。

只是为了举例说明我一直在尝试的事情:

SELECT l.theWord, count(l.theWord) as freq_low, count(u.theWord) as freq_up
FROM table_name l
INNER JOIN table_name u ON l.lcTheWord = u.lcTheWord
group by l.lcTheWord;

这显然是错误的方法,因为它似乎没有使用必要的索引(我花了很长时间才能看到它的作用......)

我意识到这是一个远不如指南所暗示的具体问题。道歉!但是,我想知道一些善良的灵魂是否可以给我一些指示,以便我可以从那里继续......?

非常感谢提前! 塞巴斯蒂安

1 个答案:

答案 0 :(得分:2)

我认为你不需要在这里进行自我加入 - GROUP BY就足够了。您可以使用'u'列中的'l'spelling s计算单词,如下所示:

SELECT
    lcTheWord
,   SUM(CASE spelling WHEN 'u' THEN 1 ELSE 0 END) AS UpperCount
,   SUM(CASE spelling WHEN 'l' THEN 1 ELSE 0 END) AS LowerCount
FROM table_name
GROUP BY lcTheWord