简体   繁体   English

ORDER BY-多对多MySQL查询

[英]ORDER BY - many-to-many MySQL query

I have the following problem: I have 'content' table, which keeps main posts and objects in the system, 'custom_field' table, which enables use to add any custom field to a post and 'content_data' table, which holds custom field values. 我有以下问题:我有“内容”表和“ content_data”表,“内容”表将系统中的主要帖子和对象保留在系统中,“ custom_field”表可用于向帖子中添加任何自定义字段,而“ content_data”表则包含自定义字段值。 简化的数据库图

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;

Now, I want to be able to ORDER result set BY custom field value. 现在,我希望能够按自定义字段值对结果集进行排序。 Both custom_field.name column and content_data.value column are indexed, but that does not seem to help and the query is very slow. custom_field.name列和content_data.value列都已建立索引,但这似乎无济于事,并且查询非常慢。 content_data.custom_field_id is certainly indexed as well. 当然也会为content_data.custom_field_id编制索引。

Here's my query: 这是我的查询:

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`

Is there any way to do it in a more optimized way? 有什么办法可以更优化地做到这一点?

在此处输入图片说明

Thank you in advance! 先感谢您!

I want to be able to ORDER result set BY custom field value. 我希望能够按自定义字段值对结果集进行排序。 Both custom_field.name column and content_data.value column are indexed custom_field.name列和content_data.value列均已建立索引

You have entitled content_data.value as the column to sort by. 您已将content_data.value为要作为排序依据的列。 That is a varchar(255) column. 那是一个varchar(255)列。 The real 'title_sort' is an indexed varchar(50) column from custom_field.name . 真正的'title_sort'是custom_field.name的索引varchar(50)列。

This is closer to your described requirement: 这更接近于您描述的要求:

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`

However, what you do want is very probably a sort on content_data . 但是,您想要的很可能是对content_data的排序。 value . value

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM