За последние 24 часа нас посетили 17853 программиста и 1654 робота. Сейчас ищут 1615 программистов ...

Запрос на выборку из двух таблиц

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

  1. PCSpeaker

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

    С нами с:
    26 дек 2007
    Сообщения:
    84
    Симпатии:
    0
    Есть 2 таблицы. Одна "темы" (themes) другая "сообщения"(guest). У каждой темы есть свой номер (themes.index), у каждого сообщения есть свой номер (guest.index). Так же у каждого сообщения есть номер темы к которому он принадлежит (guest.theme). Так вот мне нужно сделать запрос на выборку, чтобы выбрались все столбцы таблиц "темы" и "сообщения", где guest.index максимальный и где guest.theme=themes.index. Причем сортировка должна осуществляться именно по этому guest.index по убыванию.

    Делаю это так:
    Код (Text):
    1. $res=mysql_query( "SELECT themes.*, guest.* FROM themes, guest WHERE (guest.index = max(guest.index) and guest.theme = themes.index) ORDER BY guest.index desc");
    2. while ($stroka = mysql_fetch_row($res)) {
    3. Совершаю операции со $stroka[...]
    4. }
    Вот что в итоге получаю:
    Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/altwalls/public_html/forum.php on line 65

    Видимо пустой запрос выходит... Помогите сделать, чтобы работало. Я вобщем-то уже до причины ошибки то догадался. По ходу дела он сначала выбирает максимальный индекс, а потом только смотрит чтобы совпадал номер темы с заданной, а у максимального номер другой. А нужно чтобы наоборот он выбрал сначала все сообщения с данным номером темы, а только потом нашел среди них с максимальным индексом...
     
  2. PCSpeaker

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

    С нами с:
    26 дек 2007
    Сообщения:
    84
    Симпатии:
    0
    решил это исправить сделав запрос в запросе. вот так вот:

    Код (Text):
    1.     $res2=mysql_query("SELECT themes.*, guest.* FROM themes, guest WHERE (guest.index = max(SELECT guest.index FROM guest, themes WHERE guest.theme=themes.index) and guest.theme=themes.index)");
    тоже не работает. притом, что

    методом тестирования я получил следующее:
    запрос
    SELECT guest.index FROM guest, themes WHERE guest.theme=themes.index
    работает и получает числа 40 и 42

    запрос
    SELECT themes.*, guest.* FROM themes, guestWHERE (guest.index = '42' and guest.theme=themes.index)
    тоже работает

    общий же запрос работать не хочет. Видимо все упирается в то, что он не может выбрать наибольшее число из двух или после выбора представляет их не в том формате в котором нужно.
     
  3. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
  4. PCSpeaker

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

    С нами с:
    26 дек 2007
    Сообщения:
    84
    Симпатии:
    0
    Заставил таки работать. Код выглядит так.
    Код (Text):
    1. $res2=mysql_query("SELECT themes.*, guest.* FROM themes, guest WHERE (guest.index = SELECT max(guest.index) FROM guest, themes WHERE guest.theme=themes.index) and guest.theme=themes.index");
    Но работает оно неправильно. Вместо того чтобы искать для каждой темы свое максимальное сообщение, он берет сообщения всех тем и ищет максимальное из них. Соответственно в итоге получается таблица с одной темой...

    Goryn, честно пытался извлечь из ссылки пользы, но не нашел применения =(

    Быть может я избрал плохой способ реализации того что я хочу?
    Я всего лишь хочу чтобы сообщения с максимальным индексом, но принадлежащие разным темам (поэтому максимальный индекс у каждого свой) сравнивались и в зависимости от того чей индекс больше тема писалась выше. Элементарная сортировка по последнему написанному сообщению((
     
  5. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    [sql]select * from themes t, guest g
    where t.index=g.theme and g.index in (select max(index) from guest
    group by theme)[/sql]
    А там сортируй как тебе надо и постарайся не использовать служебных фраз типа index в наименовании полей таблиц.
     
  6. PCSpeaker

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

    С нами с:
    26 дек 2007
    Сообщения:
    84
    Симпатии:
    0
    Гениально! оно работает!!! спасибо огромное!

    да и вправду несколько двусмысленно получается...