За последние 24 часа нас посетили 17616 программистов и 1722 робота. Сейчас ищут 1859 программистов ...

Как вывести запись с последней датой

Тема в разделе "PHP для новичков", создана пользователем viktor72, 2 июл 2017.

Метки:
  1. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Надо вывести заказ соответствующего статуса (статус - 1 "открытый"), название фирмы и один комментарий последний по дате .
    Проблема - не выводится последний комментарий с последней датой , вместо него выводится первый комментарий.
    Выводятся как надо заказы указанного статуса и фирмы .

    Имеются 4 таблицы таблицы (см на картинке):
    zakaz
    firm
    status
    koment

    Вот запрос:
    PHP:
    1. "SELECT * FROM zakaz
    2. LEFT JOIN firm ON firm.id = zakaz.firm_id
    3. LEFT JOIN status ON status.id = zakaz.status_id
    4. LEFT JOIN koment ON koment.zakaz_id = zakaz.id
    5. WHERE status.id = 1
    6. GROUP BY zakaz.id
    7. ORDER BY koment.date DESC";
    img-2017-07-02-00-57-19.png
    Как сделать запрос чтоб всё выводилось как сейчас, но только с последней датой ?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    ORDER BY koment.id DESC";
    пробни
     
    viktor72 нравится это.
  3. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Переделал. К сожалению... ничего не изменилось
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    +
    SELECT koment.koment AS test FROM

    var_dump ( $result );

    посмотри что пришло
     
    viktor72 нравится это.
  5. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    $result = "SELECT koment.koment AS test FROM koment";
    var_dump ( $result );

    string(40) "SELECT koment.koment AS test FROM koment"

    весь запрос надо было расписать или вставить ка есть?

    $result = "SELECT koment.koment AS test FROM";
    string(33) "SELECT koment.koment AS test FROM"
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    мне нужен результат запроса от базы данных
     
    viktor72 нравится это.
  7. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @viktor72 ещё можешь запросы проверять сначала в PHPMyAdmin
     
    viktor72 нравится это.
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    LEFT JOIN status ON status.id = zakaz.status_id

    WHERE status.id = 1
    чтот вообще голова не варит, но говорит WHERE status.status = 1

    это нафиг удалим:
    GROUP BY zakaz.id

    тогда получается
    SELECT * FROM zakaz
    LEFT JOIN firm ON firm.id = zakaz.firm_id
    LEFT JOIN status ON status.id = zakaz.status_id
    LEFT JOIN koment ON koment.zakaz_id = zakaz.id
    WHERE status.status = 1
    ORDER BY koment.id DESC
     
    viktor72 нравится это.
  9. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    в оригинале таблиц больше и запрос сложнее, это я для примера всё минимизировал, поэтому не знаю как быть с var_dump ();
    PHP:
    1. $sql_vak = "SELECT*
    2. FROM vakans AS v
    3. LEFT JOIN firm AS f ON f.idfirm = v.firm_idfirm
    4. LEFT JOIN gorod AS g ON g.idgorod = v.gorod_idgorod
    5. LEFT JOIN dolzgnost AS d ON d.iddolzgnost = v.dolzgnost_iddolzgnost
    6. LEFT JOIN status_vakans_has_vakans AS svhv ON svhv.idvakans = v.idvakans
    7. LEFT JOIN status_vakans AS sv ON sv.idstatus_vakans = svhv.idstatus_vakans
    8. LEFT JOIN vakans_has_pole AS vp ON    vp.vakans_idvakans = v.idvakans
    9. LEFT JOIN pole AS p ON p.idpole = vp.pole_idpole
    10. WHERE svhv.idstatus_vakans = 1
    11. GROUP BY vp.vakans_idvakans
    12. ORDER BY vp.idv_has_p DESC";
    img-2017-07-03-01-20-55.png
    убрал group by - выдает повторы vakans.id на каждый комент. не годится.

    Почему ORDER BY koment.id DESC выдает не последнюю запись а первую? Значит desc не работает в данном случае. почему? значит надо или ещё что то добавить чтоб desc заработал или использовать какую то другую функцию или совсем другой придумать маневр. может я не там ищу. Кто может поддсдкажите
     
    #9 viktor72, 3 июл 2017
    Последнее редактирование: 3 июл 2017
  10. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Может сделать селект в селекте?
     
  11. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    так как сейчас - запрос выберает первую внесенную дату а desc из выбранных выстраивает их.
    а надо чтоб в таблице vakans_has_pole выберал последнюю дату и выводил в соответствии с остальными требованиями запроса.

    Подозреваю , что надо делать запрос в запросе.
    Помогите.
     
  12. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Задача решается двумя основными способами:
    1) используя два отдельных запроса
    2) используя подзапрос

    1-й лучше (при постраничном выводе), 2-й проще.
    Для второго варианта чтобы выдать последнюю запись для vakans_has_pole, будет что-то вроде:
    PHP:
    1. LEFT JOIN vakans_has_pole AS vp ON vp.vakans_idvakans = v.idvakans
    2.   and vp.idv_has_p = (select max(idv_has_p) from vakans_has_pole
    3.     where vakans_idvakans = v.idvakans)
    При условии, что нужна запись с максимальным idv_has_p.
    В основном запросе GROUP BY не должно быть, естественно.

    И ещё, разберись, чем отличается LEFT JOIN от INNER JOIN, в т.ч. когда нужно применять тот или иной.
     
    viktor72 нравится это.
  13. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Красота!
    Я пока ждал ответа решил задачу - написал второй запрос в цикле. Но чувствую - это жестоко, так не должно быть.
    PHP:
    1. while($row = mysqli_fetch_array($query)){
    2. ...
    3. $select_date = "SELECT * FROM vakans_has_pole WHERE vakans_has_pole.vakans_idvakans='$row[idvakans]'
    4.        ORDER BY date DESC LIMIT 1";
    5.         $query_date = mysqli_query($dsd, $select_date);
    6.         while($row_date = mysqli_fetch_array($query_date)){
    7. echo 'Дата последнего скрининига - '.date("d.m.y", strtotime($row_date[date])). '<br><br>';
    8.         }
    9. }
    Подозреваю что такой варинат жрём много трафика. Поменял на Ваш вариант.

    В чём затаилось зло от GROUP BY?

    Начинаю перечитывать.

    Спасибо!
     
  14. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Почитал про JOIN ы , не могу понять как в моем случае можно использовать INNER JOIN .
     
  15. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Плохо читал, - читай ещё.

    Грубо...
    Более правильно будет так:
    PHP:
    1. INNER JOIN status_vakans_has_vakans AS svhv ON svhv.idvakans = v.idvakans
    2. ...
    3. WHERE svhv.idstatus_vakans = 1
    Почитай и про него. В т.ч. про вывод данных от балды в поля, не указанные в GROUP BY.
    Кроме того, он не решает задачу в этом месте, никак.
     
    viktor72 нравится это.
  16. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Да, всё правильно. Выпустил из вида. Спасибо.
    В моем понимании INNER JOIN и WHERE одно и тоже. Я ошибаюсь?
    GROUP BY убрал, он действительно ничего не давал.
    --- Добавлено ---
    Недостатки планирования... не учел важную деталь - теперь на каждую vakans надо вывести по каждому полю (таблица pole) по последней дате или id записаь (vakans_has_vakans) img-2017-07-06-23-31-00.png
    выводить надо так:
    Ваканс1 , kolich-pole1(последняя дата), kolich-pole2(последняя дата), kolich-pole3(последняя дата).

    Как это сделать в подзапросе ума не приложу. представляю как это сделать грубо селектом в цикле.
    Если можете подскажите(скрин всех таблиц выше).
     
  17. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Прочитай, что написал, подумай, а потом напиши понятно, что ты хочешь.
     
    viktor72 нравится это.
  18. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Да, я уже вижу что написал не понятно. Думаю.