我正在构建一个 twitter 应用程序,该应用程序在 twitter 上显示发布的链接,但是在按时间对表格进行排序时出现问题。
tweet
+----------------------------------------+
| tweet_id | [...] | created_at |
+----------------------------------------+
| 123456 | [...] | 2012-06-11 11:31:28 |
| 234567 | [...] | 2012-06-11 11:32:55 |
| 345678 | [...] | 2012-06-11 11:33:22 |
+----------------------------------------+
tweets_url
+---------------------+
| tweet_id | url |
+---------------------+
| 123456 | cnn.com |
| 123456 | fox.com |
| 234567 | abc.com |
| 345678 | abc.com |
+---------------------+
这是我的 SQL(我使用 GROUP by 仅返回唯一的 URL):
SELECT tweet_urls.url,
FROM `tweets`
LEFT JOIN tweet_urls ON tweet_urls.tweet_id = tweets.tweet_id
WHERE tweet_urls.url LIKE '%cnn.com%'
GROUP BY tweet_urls.url
ORDER BY tweets.created_at DESC LIMIT 0 , 20
我尝试了使用不同的连接和内部 SELECTS从此处使用外部选择运行此查询的不同变体。
编辑:我做了一些进一步的测试。似乎 Mysql 基于 GROUP BY tweet_urls.url 创建了一个临时表,然后使用指定的索引对结果进行排序,因为它是在临时表上运行的。
这是解释输出:
+----+-------------+------------+--------+---------------+---------+---------+-----+----------------------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+---------------------------------------------------------------------------------------------------------+----------------------------------------------+
| 1 | SIMPLE | tweet_urls | index | tweet_id | url | 422 | NULL 86783 | Using where; Using temporary; Using filesort
| 1 | SIMPLE | tweets | eq_ref | PRIMARY | PRIMARY | 8 | tweet_urls.tweet_id |
+----+-------------+------------+--------+---------------+---------+---------+-----+----------------------+----------------------------------------------+