1

私は8つの別々のテーブルを持っています。各テーブルには、ID、日時フィールド、およびいくつかのテキストがあります。

タイムラインビューの単一ページにすべてのテーブルから結合されたデータを表示しています。最新のエントリが一番上にあり、各テーブルのエントリがこのタイムラインに混在しています。

ここで難しい部分です。このWebサイトにページ付けを追加する必要があるため、各ページに正確に10日を表示します(最後のページを除いて、10日未満の場合があります)。各テーブルには、可変数の行が含まれる場合があります。

私はかなり長い間これに苦労してきましたが、まだエレガントな解決策を思い付いていません。

これが例です(この例では、簡単にするために2つのテーブルのみを選択します)。

tableA

4月1日| a14
月5日| a24
月7日| a3

tableB

4月2日| b
14月2日| b24
月5日| b34
月6日| b4

グローバルタイムラインは次のようになります


4月7日a34
月6日b44月5日a24 月5
日b 34 月2日b24月2 日b 14月1日a1



また、各ページに3日しか表示されない場合は、次のようにする必要があります。

--- p1---
4月7日a34
月6日b44
月5日a2

--- p2---
4月5日b34
月2日b24
月2日b1

--- p3---
4月1日a1

問題は、このデータをエレガントな方法でクエリする方法がわからないことです。これが私がいじっていたいくつかのライブクエリです:

select date(d.entryTime)entryDate、date(wc.changeTime)wcDate from diary_entry d join water_change wc on d.aquariumId = wc.aquariumId where d.aquariumId = 2 group by entryDate order by entryDate limit 10、5

したがって、1つのテーブルに対して、次のクエリがあります。select date(d.entryTime)entryDate from diary_entry d where d.aquariumId = 2 group by entryDate

13件の結果が得られますエントリ 日付 2012-01-132012-01-142012-01-25
2012-01-26 2012-01-31 2012-02-04 2012-02-17 2012-02-20 2012-02-25 2012-03-17 2012-03-31 2012-04-01 2012-04-06










もう1つは、date(wc.changeTime)changeDate from water_change wc where wc.aquariumId = 2 groupbychangeTimeを選択します。

8つの結果が得られ ます
2012-01-222012-01-262012-02-17
2012-02-25
2012-03-04
2012-03-10
2012-04-04
2012-04-24

2つの間に3つの一般的な日があります2012-01-262012-02-172012-02-25

したがって、生成する必要のあるクエリは、13+8-3行=18行である必要があります。

そして解決策が見つかりました!(select date(d.entryTime)activityDate from diary_entry d where d.aquariumId = 1 group by activityDate)union(select date(wc.changeTime)activityDate from water_change wc where wc.aquariumId = 1 group by activityDate order by activityDate)limit 10 、10

4

2 に答える 2

3

ユニオンを使用してクエリします。

SELECT TheDate,
       TheText
  FROM Table_A
 WHERE [your critera]
 UNION
SELECT TheDate,
       TheText
  FROM Table_B
 WHERE [your critera]
...

個別のもののみを選択する必要がある場合は、次のようにラップできます。

Select Distinct
       TheDate,
       TheText
  From 
(
 SELECT TheDate,
       TheText
  FROM Table_A
 WHERE [your critera]
 UNION
SELECT TheDate,
       TheText
  FROM Table_B
 WHERE [your critera]
...
);
于 2012-04-28T03:06:44.637 に答える
1

選択と結合が適切に行われていて、ページネーションが欠落しているようです。その場合、スクリプトは現在のページを追跡する必要があり、「次のページ」をクリックするたびに、これを SELECT クエリに追加して、次の 10 レコードをどこから返すかを MySQL に指示する必要があります。

選択...結合...場所...並べ替え... LIMIT 20, 10

完全なレコード セットの 21 行目から始まる次の 10 行を返します

于 2012-04-28T02:47:58.877 に答える