我在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;
这显然是错误的方法,因为它似乎没有使用必要的索引(我花了很长时间才能看到它的作用......)
我意识到这是一个远不如指南所暗示的具体问题。道歉!但是,我想知道一些善良的灵魂是否可以给我一些指示,以便我可以从那里继续......?
非常感谢提前! 塞巴斯蒂安
答案 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