ORDER BY - 多对多MySQL查询

时间:2017-11-12 00:15:46

标签: mysql sql

我有以下问题: 我有'content'表,它保留系统中的主要帖子和对象'custom_field'表,它允许使用任何自定义字段添加到帖子和'content_data'表,其中包含自定义字段值。 Simplified database diagram

CREATE TABLE `cms_content` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `cms_content_data` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `custom_field_id` int(11) NOT NULL,
 `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `content_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `key` (`value`,`content_id`,`custom_field_id`) USING BTREE,
 KEY `content_id` (`content_id`),
 KEY `custom_field_id` (`custom_field_id`),
 KEY `value` (`value`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `cms_custom_field` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `name_2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

现在,我想能够ORDER结果集BY自定义字段值。 custom_field.name列和content_data.value列都已编制索引,但这似乎没有帮助,查询速度很慢。 content_data.custom_field_id当然也被编入索引。

这是我的疑问:

SELECT `content`.`id`, `content_data`.`value` AS `title_sort` 
FROM `content` 
INNER JOIN `content_data` ON `content_data`.`content_id` = `content`.`id` 
LEFT JOIN `custom_field` ON `custom_field`.`id` = `content_data`.`custom_field_id`
WHERE `custom_field`.`name` = 'title_sort'
ORDER BY `title_sort`

有没有办法以更优化的方式做到这一点?

enter image description here

提前谢谢!

1 个答案:

答案 0 :(得分:0)

  

我希望能够通过自定义字段值对结果集进行ORDER。都   custom_field.name列和content_data.value列已编制索引

您已将content_data.value作为要排序的列。这是一个varchar(255)列。真正的title_sort'是来自custom_field.name的索引varchar(50)列。

这更接近您描述的要求:

SELECT 
           `content`.`id`
         , `custom_field`.`name` AS `title_sort`
         , `content_data`.`value`AS whatever_this_is
FROM  `custom_field`
INNER JOIN `content_data`  ON `custom_field`.`id` = `content_data`.`custom_field_id`
INNER JOIN `content` ON `content_data`.`content_id` = `content`.`id`
WHERE `custom_field`.`name` = 'title_sort'
ORDER BY `custom_field`.`name`

但是,你想要的很可能是content_data上的一种排序。value