За последние 24 часа нас посетили 20808 программистов и 1114 роботов. Сейчас ищут 397 программистов ...

Подскажите как правильно составить SQL запрос.

Тема в разделе "PHP и базы данных", создана пользователем Artur_hopf, 15 фев 2019.

  1. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день. Есть две таблицы, одна database1 со списком нужных ID:
    Код (Text):
    1.  
    2. IP      | OID
    3. 0.0.0.1 | 93E8FECB-8782-4357-B0FC-75C147594F50
    4. 0.0.0.1 | E0472205-8C90-4C66-A5EF-F36BE9399875
    5. 0.0.0.1 | B8BBC8B6-F36F-434F-9574-91CDAF1E708D
    И вторая таблица database2 из которой нужно выдернуть строку с последней датой по всем OID из первой таблицы.

    Если напишу такой запрос и выдерну просто startDate и OID все сработает:
    PHP:
    1. SELECT MAX(DT.startDate) AS date, CON.OID
    2. FROM database1 AS DT
    3. JOIN database2 AS CON ON(CON.OID = DT.OID )
    4. WHERE CON.IP = '0.0.0.1'
    5. GROUP BY CON.OID
    Но мне нужны так же и другие параметры по мимо даты.
    Подскажите как выдернуть из таблицы всю строку, а не только два столбца?
    Сейчас я вытаскиваю только эту самую максимальную дату. Результат запроса примерно такой:
    Код (Text):
    1.  
    2. date                    | OID
    3. 2019-02-12 23:30:02.000 | 93E8FECB-8782-4357-B0FC-75C147594F50
    4. 2019-02-06 20:00:27.000 | E0472205-8C90-4C66-A5EF-F36BE9399875
    5. 2019-02-08 13:57:24.000 | B8BBC8B6-F36F-434F-9574-91CDAF1E708D
    Если напишу просто
    Код (Text):
    1. SELECT MAX(DT.startDate) AS date, CON.OID, DT.endDate
    Будет ошибка :
    Столбец "database1.endDate" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
    Подскажите как правильно написать запрос.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Потому что в общем случае может быть несколько строк, удовлетворяющим условиям группировки. И данные в остальных ячейках этих строк могут не быть одинаковыми.
    Можно запрос, определяющий дату и OID использовать в качестве "таблицы" для join (не забыв про псевдоним "внутреннего" запроса):
    Код (Text):
    1. select t1.* from table1 as t1 join (select max(..) as `date`, OID ... group by OID) as Q1 on Q1.`date` = t1.`date` and Q1.OID = t1.oid
     
    Artur_hopf нравится это.