2014-10-24 3 views
0

Я пытаюсь следовать за ответ, данный в «Retrieving the last record in each group», но у меня есть проблемаПо алфавиту MYSQL Сортировать по последней записи в группе

Моя проблема заключается в том, что я вторя и Y78430-х (т.е. рассчитывать 1 и 3), когда я только хочу, чтобы эхо счет 3

Я пытаюсь выбрать последнюю запись групп данных, где последняя запись - нижняя алфавитная буква.

Пример моих данных здесь (таблица 'schedulelocation'): -

Count  cif_train_uid  cif_stp_indicator  Other Data 

    1   Y78430     p     zzzzzzz 
    2   Z45012     p     fffffff 
    3   Y78430     o     sssssss 

В приведенных выше данных есть 2 X Y78430. Я хотел бы повторить только один из них. Один с cif_stp_indicator из о - т.е. его ниже в алфавите, чем «р»

Вот мой код: -

$b="SELECT s1.cif_train_uid,s1.cif_stp_indicator,s1.schedule_start_date 
FROM schedulelocation s1 
LEFT JOIN schedulelocation s2 
    ON (s1.cif_train_uid AND s1.cif_stp_indicator < s2.cif_stp_indicator) 
WHERE s2.cif_stp_indicator is Null AND s1.cif_train_uid='Y78430' ";    

$l=mysqli_query($mysql_link,$b); 

if ($l) { 

while($berths=mysqli_fetch_array($l,MYSQLI_ASSOC)) 
{ 

echo $berths['cif_train_uid']; 
echo $berths['cif_stp_indicator']; 
echo $berths['schedule_start_date']; 
echo "</b>"; 
echo "</b>"; 


}  

      }   

Любая помощь очень ценится. Спасибо

+0

Да ладно, вы можете это сделать! (хотя я бы предположил, что это фактически «первая» запись в каждой группе - согласно вашему критерию) – Strawberry

ответ

1

Вам необходимо использовать агрегированный запрос, чтобы найти соответствующую строку для отображения и присоединиться к этой основной информации.

Ваш совокупный запрос следующим образом:

   SELECT cif_train_uid, 
        MIN(cif_stp_indicator) as cif_stp_indicator 
       FROM schedulelocation 
      GROUP BY cif_train_uid 

Он возвращает список пар (поезд, индикатор), где показатель является самым низким (лексически первый) один поезд.

Тогда вы INNER присоедините его к остальной части вашего запроса, как это.

 SELECT s1.cif_train_uid,s1.cif_stp_indicator,s1.schedule_start_date 
     FROM ( SELECT cif_train_uid, MIN(cif_stp_indicator) as cif_stp_indicator 
        FROM schedulelocation 
       GROUP BY cif_train_uid 
      ) AS m 
INNER JOIN schedulelocation s1 
     ON m.cif_train_uid=s1.cif_train_uid 
     AND m.cif_stp_indicator = s1.cif_stp_indicator 
    LEFT JOIN schedulelocation s2 
     ON s1.cif_train_uid 
     AND s1.cif_stp_indicator < s2.cif_stp_indicator) 
     WHERE s2.cif_stp_indicator is Null /* IS THIS CORRECT ?? */ 
     AND s1.cif_train_uid='Y78430' 

Примечание Я не 100% уверен, что происходит с вашим автообъединением операции. Я думаю, что ваше первое предложение WHERE исключает все строки, где самосоединение действительно что-то нашло. Я не понимаю.

+0

Спасибо Олли. Это отлично работает. Я бы никогда не справился с этим. – user2635961