Çevredeki satır php / mysql seçin

5 Cevap php

Ben yani bir satır seçin ve ardından önce ve sonra 5 kayıtları döndürmek koşullarına uyumlu bir satır etrafında satır grubunu seçmek istiyorum.

Olarak talep fazla bilgi (o maçı üzgünüm!)

Tamam, böylece tablo kayıtları bir yarış kez tur. Atlatmali Kullanıcıları (kullanıcılar birçok tur var) ilişkilidir. Ben gerekli Kullanıcı iyi kucağında üstünde ve altında EŞSİZ kullanıcılardan en iyi tur sonra x sayısı bir kullanıcı için en iyi tur zamanı bulmak istiyorum.

Bu mümkün mü?

5 Cevap

Bu gerçekten PHP-Steven'ın cevap için sadece bir düzeltme ama ben bir yorum yapmak için yeterli temsilcisi yok.

SELECT `lap_time`, `uid` 
FROM `table` t1
WHERE `lap_time` =< 120
AND NOT EXISTS (SELECT 1 FROM `table`
                 WHERE `uid` = t1.`uid` AND `lap_time` > t1.`lap_time` AND `lap_time` < 120)
ORDER BY `lap_time` DESC
LIMIT 5

ve

SELECT `lap_time`, `uid` 
FROM `table` t1
WHERE `lap_time` > 120
AND NOT EXISTS (SELECT 1 FROM `table`
                 WHERE `uid` = t1.`uid` AND `lap_time` < t1.`lap_time` AND `lap_time` > 120)
ORDER BY `lap_time` DESC
LIMIT 5

The only difference is the NOT EXISTS clauses which serve to eliminate secondary lap times by the same user. Otherwise, you get the next slowest ve fastest lap_times, but not the next slowest/fastest unique users.

Bu gibi bir şey olmalıdır:

lap_time = column with lap times (assumed to be an int or numeric)
laps = table containing lap times
CURRENT_LAP_TIME = the lap time in question

o zaman

SELECT lap_time FROM laps
WHERE lap_time < CURRENT_LAP_TIME
ORDER BY lap_time DESC LIMIT 5
UNION
SELECT lap_time FROM laps
WHERE lap_time >= CURRENT_LAP_TIME
ORDER BY lap_time LIMIT 6

Sen başka bir SELECT deyiminde şeyi sarın ve belirli bir düzen içinde isterseniz bir ORDER BY yapabilirsiniz. (Ben ilk SELECT deyimi tersine çevirmek için daha iyi bir yol olduğunu düşünüyorum, ama kafamın üst kapalı bunu düşünemiyorum.)

Bu yüzden tur zamanları göre sıralamak istediğinizi varsayalım gidiyorum.


SELECT `lap_time`, `uid` 
FROM `table`
WHERE `uid` = x AND `lapnum` = y

Bu son tur için satır alacak. Onun bir INT olarak depolanır söylemek sağlar ve saniye içinde. Ve sonuç 120'dir.

Şimdi tüm tur zamanları çabuk seçin.


SELECT `lap_time`, `uid` 
FROM `table`
WHERE `laptime` =< 120
GROUP BY `uid`
ORDER BY `laptime` DESC
LIMIT 5 

Ve son olarak tüm tur zamanları yavaş seçin.


SELECT `lap_time`, `uid` 
FROM `table`
WHERE `laptime` >= 120
GROUP BY `uid`
ORDER BY `laptime` ASC
LIMIT 5 

Ve bu size ihtiyacınız olan tüm 11 satırları verecektir!

Çok seyrek veri göz önüne alındığında, sadece bir very genel çözüm sağlayabilir. Ilham kaynağı olarak düşünün:

SELECT
    id,
    fieldX,
    ABS(id - <id-to-select>) AS distance
FROM
    table
WHERE
    ABS(id - <id-to-select>) < 5
ORDER BY
    distance DESC

Bu yöntem, bununla birlikte, not ile bir satır id = <id-to-select> döndürülür garanti etmez. Sadece bu kimliği satır "en yakın" döndürür.

Yine, bu only ilham kaynağı olarak geliyordu olduğunu.

Bu hacking biraz aldı, ama benim ucunda çalışıyor gibi görünüyor.


SELECT *
FROM `lap_times`
WHERE `id` IN (
    SELECT * FROM (
    	SELECT lt1.id
    	FROM `lap_times` lt1
    	WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
    	AND lt1.time <= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
    	AND lt1.user_id != 2
    	ORDER BY lt1.time ASC
    	LIMIT 5
    ) AS `tbl1`
) OR `id` = (
    SELECT `id`
    FROM `lap_times`
    WHERE `user_id` = 2
    ORDER BY `time` ASC
    LIMIT 1
) OR `id` IN (
    SELECT * FROM (
    	SELECT lt1.id
    	FROM `lap_times` lt1
    	WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
    	AND lt1.time >= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
    	AND lt1.user_id != 2
    	ORDER BY lt1.time ASC
    	LIMIT 5
    ) AS `tbl2`
)
ORDER BY `time` ASC;