我想在MySQL中执行这个查询:
SELECT `id`, `state`, `city`, `company`, `manager`, `district`, `group`, `subgroup` FROM `data_table` WHERE `id` IN (
SELECT DISTINCT `dataID` FROM `tags_data` WHERE `table` = 'data_table' AND `tagID` IN (
SELECT `id` FROM `tags` WHERE `tag` LIKE '%fruit%'
) LIMIT 0, 20 );
但MySQL 5.5不支持IN
和LIMIT
命令!
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
所以我必须使用INNER JOIN
或LEFT JOIN
并合并这些表才能使用LIMIT
但我的问题是这些表是BIG TABLES,每个页面可能会多次使用此查询!所以查询时间的成本对我来说很重要!
我知道这个问题可能重复,但我感到困惑。
答案 0 :(得分:2)
你可以摆脱你的子查询并使用join子查询将为每一行运行run所以它可能会花费你代替它们,然后使用适当的索引,只选择你需要的列
SELECT
DISTINCT
d.`id`,
d.`state`,
d.`city`,
d.`company`,
d.`manager`,
d.`district`,
d.`group`,
d.`subgroup`
FROM
`data_table` d
JOIN `tags_data` td ON (d.id =td.dataID)
JOIN `tags` t ON (t.id =td.`tagID`)
WHERE td.`table` = 'data_table' AND t.`tag` LIKE '%fruit%'
LIMIT 0, 20
索引
ALTER TABLE `tags_data` ADD INDEX `indexname1` (`dataID`);
ALTER TABLE `tags_data` ADD INDEX `indexname2` (`tagID`);
或者您可以加入具有限制的表格,以及条件WHERE td.
表格= 'data_table'
可用于加入查询
JOIN
(select dataID from `tags_data` WHERE `table` = 'data_table' limit 0,20)
td ON (d.id =td.dataID)
答案 1 :(得分:1)
thanx到M Khalid Junaid,我使用了这样的查询:
SELECT dataTable.`id`, dataTable.`state`, dataTable.`city`, dataTable.`company`, dataTable.`manager`, dataTable.`district`, dataTable.`group`, dataTable.`subgroup`
FROM `data_table` AS dataTable
JOIN `tags_data`
ON dataTable.`id`=`tags_data`.`dataID`
JOIN `tags`
ON `tags_data`.`tagID`=`tags`.`id`
WHERE `tags`.`tag` LIKE '%friut%' AND `tags_data`.`table`='data_table'
LIMIT 0, 20;
并且表现可以接受。