За последние 24 часа нас посетили 22820 программистов и 1263 робота. Сейчас ищут 774 программиста ...

Проблемы с SQL запросом

Тема в разделе "PHP для новичков", создана пользователем justc, 19 авг 2020.

  1. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Доброго времени суток.

    Какая-то чертовщина творится))

    вот такой кусок кода
    Код (Text):
    1. $time = time();
    2. $aColumns[] = "$t.date IN (SELECT MAX($t.date) FROM $t WHERE $t.date<=$time AND $t.feature=1 GROUP BY $t.fnomer)";
    3. $aOptions['order']  = "$t.fnomer ASC, $t.date DESC";
    Популярные новости группируются по номеру и сортируется по дате.

    limit = 5

    выглядит это так :

    Новость номер 1 (самая свежая дата), Новость номер 2 (самая свежая дата) ... и так далее до 5.

    и вот всё работает как надо, до вчерашнего дня))

    вот каким-то боком проскакивает новости с одинаковыми номерами

    выглядит это так:

    Новость номер 1 (самая свежая дата), Новость номер 1 (вторая по свежести дата)) ), Новость номер 2 (самая свежая дата), Новость номер 3 (самая свежая дата).... и тд


    как так я понять не могу, вроде не должно такого быть?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @justc, наверное, "вторая по свежести" дата для первой новости совпадает с одной из "самых свежих" дат остальных четырёх новостей.
    Следовательно, надо проверять не столько соответствие даты набору из подзапроса в строке номер 2.
    --- Добавлено ---
    Сделайте схемку с тестовыми данными на DB-Fiddle.
     
    justc нравится это.
  3. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @Sail, ты прав, совпадает с 4ой новостью, а как тогда сделать?
     
    #3 justc, 19 авг 2020
    Последнее редактирование: 19 авг 2020
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Откуда этот кусок кода взялся? Вообще не понятно, как запрос полностью выглядит из него
     
  5. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    #5 justc, 19 авг 2020
    Последнее редактирование: 19 авг 2020
  6. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @Sail, спасибо, за подсказку, сделал с другой стороны)) сделал поле даты уникальным
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @justc, вот вариант.
    На случай, если выборку надо делать по паре [№, дата].
    Код (SQL):
    1. SELECT t.`name`, t.`nomer`, t.`date` FROM test AS t
    2. JOIN (SELECT MAX(`date`) AS maxdate, nomer FROM test GROUP BY nomer) AS sq ON t.`nomer` = sq.`nomer` AND t.`date` = sq.`maxdate`
    3. ORDER BY t.`nomer`, t.`date` DESC;
     
    justc нравится это.
  8. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @Sail а если в $aColumns[] у меня уже критерии (WHERE)
    то есть мне нужно два критерия задать (1 AND 2)?

    с JOIN вообще не шарю, его же туда не получится?
    а так смысла нет? :

    Код (Text):
    1.  
    2. $aColumns[] = "$t.date IN (
    3.  
    4. SELECT t.`date` FROM test AS t
    5. JOIN (SELECT MAX(`date`) AS maxdate, nomer FROM test GROUP BY nomer) AS sq ON t.`nomer` = sq.`nomer` AND t.`date` = sq.`maxdate`
    6. ORDER BY t.`nomer`, t.`date` DESC;
    7.  
    8. )";
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    justc нравится это.
  10. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @Sail, ага, QueryBuilder из старого неизвестного фреймворка

    ну ок, подправил QueryBuilder, теперь могу JOIN вставлять до WHERE

    Код (Text):
    1.  
    2.  
    3. $aOptions['join']  = " JOIN (SELECT MAX(`date`) AS maxdate, nomer FROM test GROUP BY nomer) AS sq ON t.`nomer` = sq.`nomer` AND t.`date` = sq.`maxdate` ";
    4.  
    5. $aOptions['order']  = "$t.fnomer ASC, $t.date DESC";
    и вроде правильно, но второй номер пропущен)) вывелось 4 новости, вместо 5


    ps это еще без новости с одинаковой датой и тп
    --- Добавлено ---
    пардон, добавил where с нужными критериями в подзапрос и завелось как надо!
    --- Добавлено ---
    ну, вроде всё! тестирую с новостью с одинаковой датой, с join пашет как надо!

    @Sail спасибище !!