Надо вывести заказ соответствующего статуса (статус - 1 "открытый"), название фирмы и один комментарий последний по дате . Проблема - не выводится последний комментарий с последней датой , вместо него выводится первый комментарий. Выводятся как надо заказы указанного статуса и фирмы . Имеются 4 таблицы таблицы (см на картинке): zakaz firm status koment Вот запрос: PHP: "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.id = 1 GROUP BY zakaz.id ORDER BY koment.date DESC"; Как сделать запрос чтоб всё выводилось как сейчас, но только с последней датой ?
$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"
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
в оригинале таблиц больше и запрос сложнее, это я для примера всё минимизировал, поэтому не знаю как быть с var_dump (); PHP: $sql_vak = "SELECT* FROM vakans AS v LEFT JOIN firm AS f ON f.idfirm = v.firm_idfirm LEFT JOIN gorod AS g ON g.idgorod = v.gorod_idgorod LEFT JOIN dolzgnost AS d ON d.iddolzgnost = v.dolzgnost_iddolzgnost LEFT JOIN status_vakans_has_vakans AS svhv ON svhv.idvakans = v.idvakans LEFT JOIN status_vakans AS sv ON sv.idstatus_vakans = svhv.idstatus_vakans LEFT JOIN vakans_has_pole AS vp ON vp.vakans_idvakans = v.idvakans LEFT JOIN pole AS p ON p.idpole = vp.pole_idpole WHERE svhv.idstatus_vakans = 1 GROUP BY vp.vakans_idvakans ORDER BY vp.idv_has_p DESC"; убрал group by - выдает повторы vakans.id на каждый комент. не годится. Почему ORDER BY koment.id DESC выдает не последнюю запись а первую? Значит desc не работает в данном случае. почему? значит надо или ещё что то добавить чтоб desc заработал или использовать какую то другую функцию или совсем другой придумать маневр. может я не там ищу. Кто может поддсдкажите
так как сейчас - запрос выберает первую внесенную дату а desc из выбранных выстраивает их. а надо чтоб в таблице vakans_has_pole выберал последнюю дату и выводил в соответствии с остальными требованиями запроса. Подозреваю , что надо делать запрос в запросе. Помогите.
Задача решается двумя основными способами: 1) используя два отдельных запроса 2) используя подзапрос 1-й лучше (при постраничном выводе), 2-й проще. Для второго варианта чтобы выдать последнюю запись для vakans_has_pole, будет что-то вроде: PHP: LEFT JOIN vakans_has_pole AS vp ON vp.vakans_idvakans = v.idvakans and vp.idv_has_p = (select max(idv_has_p) from vakans_has_pole where vakans_idvakans = v.idvakans) При условии, что нужна запись с максимальным idv_has_p. В основном запросе GROUP BY не должно быть, естественно. И ещё, разберись, чем отличается LEFT JOIN от INNER JOIN, в т.ч. когда нужно применять тот или иной.
Красота! Я пока ждал ответа решил задачу - написал второй запрос в цикле. Но чувствую - это жестоко, так не должно быть. PHP: while($row = mysqli_fetch_array($query)){ ... $select_date = "SELECT * FROM vakans_has_pole WHERE vakans_has_pole.vakans_idvakans='$row[idvakans]' ORDER BY date DESC LIMIT 1"; $query_date = mysqli_query($dsd, $select_date); while($row_date = mysqli_fetch_array($query_date)){ echo 'Дата последнего скрининига - '.date("d.m.y", strtotime($row_date[date])). '<br><br>'; } } Подозреваю что такой варинат жрём много трафика. Поменял на Ваш вариант. В чём затаилось зло от GROUP BY? Начинаю перечитывать. Спасибо!
Плохо читал, - читай ещё. Грубо... Более правильно будет так: PHP: INNER JOIN status_vakans_has_vakans AS svhv ON svhv.idvakans = v.idvakans ... WHERE svhv.idstatus_vakans = 1 Почитай и про него. В т.ч. про вывод данных от балды в поля, не указанные в GROUP BY. Кроме того, он не решает задачу в этом месте, никак.
Да, всё правильно. Выпустил из вида. Спасибо. В моем понимании INNER JOIN и WHERE одно и тоже. Я ошибаюсь? GROUP BY убрал, он действительно ничего не давал. --- Добавлено --- Недостатки планирования... не учел важную деталь - теперь на каждую vakans надо вывести по каждому полю (таблица pole) по последней дате или id записаь (vakans_has_vakans) выводить надо так: Ваканс1 , kolich-pole1(последняя дата), kolich-pole2(последняя дата), kolich-pole3(последняя дата). Как это сделать в подзапросе ума не приложу. представляю как это сделать грубо селектом в цикле. Если можете подскажите(скрин всех таблиц выше).