0

私のプロジェクトには、会社の次のイベントの情報を取得するための 1 つ、前のイベントの情報を取得するための 3 つの mysql クエリがあり、他のすべてのイベント用に 1 つ作成したいと考えています。

日付は次のように指定されます: $date=date("Ymd");

私が持っている次のイベントのために: SELECT * FROM passeio WHERE passeio_date > $date LIMIT 0,1

前のイベントの場合: SELECT * FROM passeio WHERE passeio_date < $date LIMIT 0,1

前のイベントと次のイベントを除く他のすべての行を取得するにはどうすればよいですか。

前もって感謝します!

4

2 に答える 2

0

テーブルに主キーがある場合は、上記の 2 つのクエリを組み合わせてクエリを実行し、すべての「その他」の行を取得できます。

select * from passeio where ID not in 
(   select * from (
    select ID from passeio where passeio_date > $date LIMIT 0,1
    UNION
    select ID from passeio where passeio_date < $date LIMIT 0,1
    )t
)
于 2013-03-29T16:10:48.027 に答える
0

を使用する場合、特定の順序を念頭に置いている場合limitは、常に を含める必要があります。order byあなたが望むクエリは次のとおりだと思います:

select * from passeio where ID not in 
(   select * from (
    select ID from passeio where passeio_date > $date order by passeio_date asc LIMIT 1
    UNION ALL
    select ID from passeio where passeio_date < $date order by passeio_date desc LIMIT 1
    )t
)

重複を排除する必要がないため、 もunionaに切り替えました。union all

おそらく、これを行うためのより効率的な方法は次のとおりです。

select *
from passeio
where passeio_date > $date
order by passeio_date
limit 1, 1000000000
union all
select *
from passeio
where passeio_date < $date
order by passeio_date desc
limit 1, 1000000000

これが多かれ少なかれ効率的であるかどうかは、データ構造によって異なりますが、アンチ結合が排除され、ID を持つ必要がありません。

于 2013-03-29T22:25:03.277 に答える