0

データベースに 2 つのテーブルがあります。1 つのテーブルはマスター テーブルで、もう 1 つのテーブルは子テーブルです。ユーザーが検索を実行すると、マスター テーブルのレコードのみがクエリされ、プラス記号をクリックすると、子レコードが検索されます。クエリは次のようなものです。

SELECT * FROM TableA
GROUP BY id
LIMIT 0,10;

ユーザーが子テーブルに適用可能な検索条件を選択した場合にのみ、子テーブル (TableB) に内部結合します。次に例を示します。

SELECT * FROM TableA a
INNER JOIN TableB b on b.MasterId = a.id
GROUP BY a.id 
LIMIT 0, 10;

上記のすべては、エクスポートする必要がある場合を除いて正常に機能します。ユーザーがエクスポートする場合、データの別のビューを使用し、マスターと子のレベルがなく、フラットアウトされた結果であるため、たとえば、LIMIT を実行する場合検索で 0,10 を入力すると、10 個のマスター レコードが返されますが、10 個の子レコードを持つ 1 つのマスター レコードがある場合、エクスポートでは、マスターと子の両方の情報を含む 10 個のレコードのみが返されますが、最初のレコードのみが返されます。ビューに対してクエリを実行しているため、検索からのマスターレコードであり、同じレコードではない場合もあります。エクスポートのクエリは次のようになります。

SELECT * FROM TableC
LIMIT 0,10;

TableCは基本的に と からフラット化されたデータのビューですが、フラット化されTableATableBいるため、 を適用LIMITしても適切に適用されません。

この問題を回避する方法はありますか? 解決策はありますか?

4

1 に答える 1

0

When you use limit you should include an order by. MySQL guarantees the ordering after a group by. So, try something like this:

SELECT *
FROM TableC
ORDER BY aid
LIMIT 0,10;

As a note: this works in MySQL because of the guarantee of the ordering after a group by. This is not ANSI standard and does not apply to other databases.

于 2013-09-13T13:36:24.510 に答える