【问题标题】:MySQL Bug LIMIT in JOIN-Query change values in recordsMySQL Bug LIMIT in JOIN-Query 记录中的更改值
【发布时间】:2012-07-13 15:17:35
【问题描述】:

在以下场景中:

CREATE TABLE `table1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `text1` varchar(29) NOT NULL,
  `flag` bit(1) DEFAULT NULL,
  `reference` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE ,
  UNIQUE KEY `idx_text` (`text1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `table1` (id, text1, flag, reference) VALUES
(31486, 'YWXH-D6N4-XXH6', 0, NULL), 
(31487, 'CBH0-UJBC-MFTO', 0, NULL), 
(31488, 'FRQM-E6MW-6VFE', 1, 1657), 
(31489, 'LZOS-EYDT-1BBF', 0, NULL), 
(31490, 'D1XQ-YKAX-XQRC', 0, NULL);

CREATE TABLE `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value1` int(11) NOT NULL,
  `value2` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `value1` (`value1`),
  KEY `value2` (`value2`)
) ENGINE=MyISAM AUTO_INCREMENT=20068 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

INSERT INTO table2 (id, value1, value2) VALUES
(1657, 1891, 1748);

-- the tables are shortened from "real" tables, i used SHOW CREATE <table> to create this script.

以下查询的结果不同。 这里 mysql 为 id 31488 和 31490 的记录返回错误的位域值:

查询 1:

SELECT m.id, m.text1, m.flag, m.reference 
FROM table1 AS m LEFT JOIN table2 AS v ON v.id = m.reference 
GROUP BY m.text1 ORDER BY m.text1 DESC LIMIT 0, 5;

返回正确的结果:

id    | text1          | flag | reference
31487 | CBH0-UJBC-MFTO | 0    | NULL
31490 | D1XQ-YKAX-XQRC | 0    | NULL
31488 | FRQM-E6MW-6VFE | 1    | 1657
31489 | LZOS-EYDT-1BBF | 0    | NULL
31486 | YWXH-D6N4-XXH6 | 0    | NULL

查询 2

SELECT m.id, m.text1, m.flag, m.reference 
FROM table1 AS m LEFT JOIN table2 AS v ON v.id = m.reference 
GROUP BY m.text1 ORDER BY m.text1 DESC LIMIT 0, 4;

返回这个:

id    | text1          | flag | reference
31487 | CBH0-UJBC-MFTO | 0    | NULL
31490 | D1XQ-YKAX-XQRC | 1    | NULL
31488 | FRQM-E6MW-6VFE | 0    | 1657
31489 | LZOS-EYDT-1BBF | 0    | NULL

所以这是我的问题:

我正在使用 Joomla CMS,并且在组件的代码中,我可以更改除 LIMIT 部分之外的整个查询。 由于分页,Joomla 将限制部分添加到查询中。

有没有办法更改它与 LIMIT 命令一起使用的查询?

哦,我在服务器上的 MySQL 版本是 5.1.61(但这个错误在我的客户端 v5.5.16 上仍然存在)

【问题讨论】:

  • 什么? +1 提供适当的信息,我只能说...apparently InnoDB doesn't have that problem
  • @Wrikken 您链接到的不错的网站...但该链接上没有架构!
  • 啊,不是http://sqlfiddle.com/#!2/d80fd/1/1 出于某种原因被删除了,我归咎于用户错误...)。

标签: mysql join limit


【解决方案1】:

您的 a) 未正确插入数据 - see the BIT data type docs 和 b) 未正确选择数据 - see the docs on the Bit-Field Literals

您需要使用以下语法插入

INSERT INTO `table1` (id, text1, flag, reference) VALUES
(31486, 'YWXH-D6N4-XXH6', b'0', NULL), 
(31487, 'CBH0-UJBC-MFTO', b'0', NULL), 
(31488, 'FRQM-E6MW-6VFE', b'1', 1657), 
(31489, 'LZOS-EYDT-1BBF', b'0', NULL), 
(31490, 'D1XQ-YKAX-XQRC', b'0', NULL);

然后像这样选择:

SELECT m.id, m.text1, bin(m.flag), m.reference 
FROM table1 AS m LEFT JOIN table2 AS v ON v.id = m.reference 
GROUP BY m.text1 ORDER BY m.text1 DESC LIMIT 0, 4;

Then it all works as expected

【讨论】:

  • 感谢您的快速响应。您的解决方案有效,对我来说改动很小:)
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2013-01-03
  • 2017-04-25
  • 2014-10-16
相关资源
最近更新 更多