За последние 24 часа нас посетили 19500 программистов и 1610 роботов. Сейчас ищут 967 программистов ...

вывести записи с наибольшими id

Тема в разделе "PHP и базы данных", создана пользователем fanat190, 29 ноя 2013.

  1. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    Всем привет. у меня следующая задача.
    имеются четыре таблицы, клиент, проект, этап, документ. все они связаны по id
    задача: нужно вывести по одному клиенту, так чтобы у каждого клиента выводился последний проект, у проекта вывводился последний этап и документ. то есть все последние добавленные записи по клиенту.
    пробовал вот такой запрос, но не то
    $result="SELECT clientt.id_clientt, proekt.id_proekt, clientt.name_clientt, proekt.name_proekt, etap.name_etap, etap.id_etap, dokument.id_dokument, dokument.name_dokument
    FROM
    clientt, proekt, etap, dokument
    WHERE
    clientt.id_clientt=proekt.id_clientt and proekt.id_proekt=etap.id_proekt and proekt.id_proekt=dokument.id_proekt and etap.id_etap=dokument.id_etap
    GROUP BY clientt.id_clientt DESC
    ";
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    MAX у MySQL
     
  3. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    а где max??? я пробовал ставить max(id_proekt), но тогда только одну запись выводит. а мне нужно чтобы каждого клиента
     
  4. MaXyC_Web_Studio

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

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    никого это не смутило? или я чего то не в курсе?
    ORDER BY MAX(id_proekt) ?? вы же сортируете, а не выбираете...
     
  5. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    ну а как мне переделать запрос??? пишу вместо GROUP BY clientt.id_clientt DESC пишу ORDER BY MAX(id_proekt) он выдает ошибку на функции mysql_fetch_array
     
  6. MaXyC_Web_Studio

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

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    mysql_query($result) or die(mysql_error());

    Добавлено спустя 26 секунд:
    у вас там ошибка происходит, а какая мы догадаться не можем
     
  7. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    Invalid use of group function
    вот что он выдает
     
  8. MaXyC_Web_Studio

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

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    ну так естественно...
    GROUP BY clientt.id_clientt DESC
    так нельзя делать. DESC относится к операции сортировки, а не группировки... как вы можете группировать по увеличению или уменьшению? можно группировать по коробкам, например, людям или отделам... но не по росту макак из мадагаскара
     
  9. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    я бы тоже обиделся и ничего не сказал
     
  10. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    если такой запрос
    $result="SELECT clientt.id_clientt, proekt.id_proekt, clientt.name_clientt, proekt.name_proekt, etap.name_etap,etap.id_etap, dokument.id_dokument, dokument.name_dokument
    FROM
    clientt, proekt, etap, dokument
    WHERE
    clientt.id_clientt=proekt.id_clientt and proekt.id_proekt=etap.id_proekt and proekt.id_proekt=dokument.id_proekt and etap.id_etap=dokument.id_etap
    ORDER BY MAX(id_proekt)
    ";
    то ошибка:Column 'id_proekt' in order clause is ambiguous

    если $result="SELECT clientt.id_clientt, max(proekt.id_proekt), clientt.name_clientt, proekt.name_proekt, etap.name_etap,etap.id_etap, dokument.id_dokument, dokument.name_dokument
    FROM
    clientt, proekt, etap, dokument
    WHERE
    clientt.id_clientt=proekt.id_clientt and proekt.id_proekt=etap.id_proekt and proekt.id_proekt=dokument.id_proekt and etap.id_etap=dokument.id_etap
    ORDER BY MAX(proekt.id_proekt)
    ";
    то выдает не правильно. выдает только одного клиента, а нужно всех каждого в строку(но это уже php). и все-равно не попоследнему проекту, этапу и документу
     
  11. alba2001

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

    С нами с:
    7 фев 2012
    Сообщения:
    56
    Симпатии:
    0
    еще
    Код (Text):
    1. ORDER BY id_proekt DESC
    не пробовали?
     
  12. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    пробовал. все-равно неправильно выводится( ну же, гуру программирования, кто-нибудь поможет???

    Добавлено спустя 15 минут 43 секунды:
    у меня вообще что-то странное творится, он выводит уже не первый и не последний проект, а где -то по середине. в чем проблема может быть??? может у кого-то встречалась подобная задача???
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Поле, по которому спрашиваете, автоинкрементное? Записи в процессе работы удаляются время от времени выборочно? Если да, то гуглите, что такое разреженные ключи. Узнаете много интересного, включая то, почему максимальный ID может оказаться в середине таблицы.
     
  14. Chushkin

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

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

    Добавлено спустя 7 минут 26 секунд:
    Ваша задача решается с использованием подзапросов.
    Что-то вроде:
    Код (Text):
    1. SELECT * FROM clientt
    2. left join proekt on proekt.id = (select max(id) from proekt where proekt.id_clientt = clientt.id_clientt)
    3. left join  etap on etap.id = (select (max(id) from etap where etap.id_proekt = proekt.id_proekt)
    4. left join  dokument on dokument.id = (select (max(id) from dokument where dokument.id_proekt = proekt.id_proekt)
    т.е. сначала получаете максимальный ИД записи, а потом считываете запись(данные) по этому ИД.
     
  15. fanat190

    fanat190 Новичок

    С нами с:
    19 ноя 2013
    Сообщения:
    27
    Симпатии:
    0
    всем большущее спасибо, особенно Chushkin!!! вроде всё получилось и выводится как надо, по крайней мере пока.
    вот код.
    $result="SELECT * FROM clientt
    left join proekt on proekt.id_proekt = (select max(id_proekt) from proekt where proekt.id_clientt = clientt.id_clientt)
    left join etap on etap.id_etap = (select max(id_etap) from etap where etap.id_proekt = proekt.id_proekt)
    left join dokument on dokument.id_dokument = (select max(id_dokument) from dokument where dokument.id_proekt = proekt.id_proekt)";