2

次のシナリオでは:

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

while クエリ 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 部分を追加します。

LIMIT コマンドで動作するクエリを変更する方法はありますか?

サーバー上の私の MySQL バージョンは 5.1.61 です (ただし、このバグはクライアント v5.5.16 にまだ存在します)

4

1 に答える 1

2

a)データを正しく挿入していない-BITデータ型のドキュメントを参照してください。b)データを正しく選択していない-ビットフィールドリテラルのドキュメントを参照してください。

次の構文を使用して挿入する必要があります

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;

その後、すべて期待どおりに機能します

于 2012-07-13T15:27:42.267 に答える