2014-01-12 4 views
2

Я работаю над небольшим приложением для моряков-конкурентов, но у меня проблема. Мне нужны данные из 2 строк выше и 2 строки под строкой от конкретного моряка. Моя база данных выглядит следующим образом:Выберите строки выше и ниже SQL

enter image description here

И это SQL я использую, чтобы получить данные выше и ниже:

$data_above= mysql_query("SELECT * FROM Laser_Radiaal WHERE points < (SELECT points FROM Laser_Radiaal WHERE PLACE = ID) ORDER BY PLACE DESC LIMIT 2"); 

$data_under= mysql_query("SELECT * FROM Laser_Radiaal WHERE points < (SELECT points FROM Laser_Radiaal WHERE PLACE = ID) ORDER BY points ASC LIMIT 2"); 

Но это не работает, то, что делать я неправильно?

Спасибо!

EDIT: Я получаю следующее сообщение об ошибке:

Warning: mysql_fetch_array() expects parameter 1 to be resource 
+1

Ну, в случае, если вы когда-то есть '' заказ на месте asc' и в других 'точек asc'. Я бы ожидал 'points desc' и' points asc'. –

+0

Привет, Гордон, спасибо за вашу быструю реакцию, проблема asc/desc - это небольшая ошибка, которую я сделал, пытаясь заставить ее работать. Но это все еще не работает. –

ответ

0

В обоих случаях вы делаете WHERE points < ..., но в случае ниже (или выше, в зависимости от того, как вы смотрите на это) вы не хотите WHERE points > ... ?

Итак, это:

$data_above= mysql_query("SELECT * FROM Laser_Radiaal WHERE points < (SELECT points FROM Laser_Radiaal WHERE PLACE = ID) ORDER BY PLACE DESC LIMIT 2"); 

$data_under= mysql_query("SELECT * FROM Laser_Radiaal WHERE points > (SELECT points FROM Laser_Radiaal WHERE PLACE = ID) ORDER BY points ASC LIMIT 2"); 
+0

Спасибо, я пробовал, но я все равно получаю следующую ошибку: Warning: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean given –

+0

Хм, так что я не специалист по этой теме, может быть, кто-то, кто знает больше о который может прослушивать, но если я могу предположить, возможно, вместо того, чтобы делать «SELECT * FROM Laser_Radiaal», посмотрите, работает ли он лучше, если вы выберете определенные столбцы из этой таблицы, то есть «SELECT ID FROM Laser_Radiaal»? – Scott

+0

Черт, он по-прежнему не работает с вашим решением –

1

Ваш первый запрос тянет правильные результаты, но в обратном order.Use array_reverse() в обратном порядке результата.

Использовать >= во втором запросе и LIMIT 3, чтобы вытащить целевое значение и два выше.

Используйте array_merge, чтобы объединить два массива.

Этот код (using PDO) иллюстрирует это.

//Prepare below query 
    $query1 ="SELECT * FROM Laser_Radiaal WHERE points < 
       (SELECT points FROM Laser_Radiaal WHERE PLACE = ?) 
        ORDER BY PLACE DESC LIMIT 2"; 
    $stmt1 = $dbh->prepare($query1); 
    // Assign parameter 
    $stmt1->bindParam(1,$ID); 
    //Execute query 
    $stmt1->execute(); 
    $result1 = $stmt1->fetchAll(); 
    $result1r = array_reverse($result1); 
    //Prepare abovequery including target 
    $query2 ="SELECT * FROM Laser_Radiaal WHERE points >= 
        (SELECT points FROM Laser_Radiaal WHERE PLACE = ?) 
        ORDER BY PLACE ASC LIMIT 3"; 
    $stmt2 = $dbh->prepare($query2); 
    // Assign parameter 
    $stmt2->bindParam(1,$ID); 
    //Execute query 
    $stmt2->execute(); 
    $result2 = $stmt2->fetchAll(); 
    $finalResult = array_merge(array_reverse($result1), $result2); 
    print_r(array_values($finalResult)); 
0

Пожалуйста, проверьте следующий пример, это поможет вам в этом

select * from games order by w; 
+--------+------+------+------+------+ 
| name | p | w | d | l | 
+--------+------+------+------+------+ 
| team b | 1 | 0 | 1 | 0 | 
| team a | 1 | 0 | 0 | 1 | 
| team c | 1 | 1 | 0 | 0 | 
| team d | 2 | 2 | 0 | 0 | 
+--------+------+------+------+------+ 
4 rows in set (0.00 sec) 


mysql> SELECT NAME,P,W,D,L,@curRank := @curRank + 1 as rank FROM (select NAME,P,W,D,L from games order by w DESC) x,(SELECT @curRank := 0) r; 
+--------+------+------+------+------+------+ 
| NAME | P | W | D | L | rank | 
+--------+------+------+------+------+------+ 
| team d | 2 | 2 | 0 | 0 | 1 | 
| team c | 1 | 1 | 0 | 0 | 2 | 
| team b | 1 | 0 | 1 | 0 | 3 | 
| team a | 1 | 0 | 0 | 1 | 4 | 
+--------+------+------+------+------+------+ 
4 rows in set (0.01 sec) 


mysql> SELECT NAME,P,W,D,L,rank FROM (SELECT NAME,P,W,D,L,@curRank := @curRank + 1 as rank,if(name ="team b",@curRank := @curRank*-1,0) AS required_rank FROM (select NAME,P,W,D,L from games order by w DESC) x,(SELECT @curRank := 0) r) p order by abs(rank) desc limit 3; 
+--------+------+------+------+------+------+ 
| NAME | P | W | D | L | rank | 
+--------+------+------+------+------+------+ 
| team b | 1 | 0 | 1 | 0 | 3 | 
| team c | 1 | 1 | 0 | 0 | 2 | 
| team a | 1 | 0 | 0 | 1 | -2 | 
+--------+------+------+------+------+------+ 
3 rows in set (0.00 sec) 
+0

в приведенном выше примере я получаю соответствующее сырое и его выше и ниже запись, как будто изменяя предел, вы можете получить требуемый диапазон –

Смежные вопросы