Получении данных одним sql запросом [PHP][SQL]

Тема в разделе "PHP", создана пользователем rsha1988, 5 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rsha1988

    rsha1988

    Регистр.:
    7 апр 2006
    Сообщения:
    550
    Симпатии:
    133
    Привет всем.

    Есть две sql таблицы search_list и comments. Нужно ОДНИМ sql запросом выполнить три действия:
    Код:
    1)SELECT * FROM search_list ORDER BY count DESC LIMIT 10
    2)SELECT * FROM search_list ORDER BY date DESC LIMIT 10
    3)SELECT * FROM comments  ORDER BY id DESC LIMIT 1
    Уже в течении двух дней рыскаю в сети и пытаюсь найти примеры ... но внятного пока что ничего найти нес мог! :confused:
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
  3. rsha1988

    rsha1988

    Регистр.:
    7 апр 2006
    Сообщения:
    550
    Симпатии:
    133
    Пробывал!
    Но почему то :
    Код:
    (SELECT * FROM search_list ORDER BY count DESC LIMIT 10) UNION ALL
    (SELECT * FROM search_list ORDER BY date DESC LIMIT 10) UNION ALL
    (SELECT * FROM comments  ORDER BY id DESC LIMIT 1)
    -вызывает ошибку на третьем запросе
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    А вложенный запрос
    Код:
    SELECT *
    , (SELECT * FROM search_list ORDER BY count DESC LIMIT 10)
    , (SELECT * FROM search_list ORDER BY date DESC LIMIT 10)
    FROM comments  ORDER BY id DESC LIMIT 1
    смотрел?
     
    rsha1988 нравится это.
  5. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    а какую ошибку-то?
    может напишите ее номер, и сообщение ошибки?
    [telepatemod]
    в таблицах search_list и comments одинаковое количество столбцов?
    скорее всего нет, поэтому и ошибка.в UNION все результаты должны иметь одинаковое количество полей.
    попробуйте вместо * указать конкретные поля, так чтобы их количество везде совпадало
    [/telepatemod]

    2 KillDead
    что по вашему должен сделать этот запос?
    насколько я помню вложенные SELECT-ы могут использоватся в качестве значений, если возвращают одну строку
    короче говоря этот запос не должен работать, насколько мне известен MySQL
     
  6. rsha1988

    rsha1988

    Регистр.:
    7 апр 2006
    Сообщения:
    550
    Симпатии:
    133
    Таблицы search_list и comments отличаются от друг друга и имеют разную структуру! Да!
    --
    "вложенный запрос" выдает ошибку:
    #1241 - Operand should contain 1 column(s)

    Таблицы search_list и comments отличаются от друг друга и имеют разную структуру!


    Alternator
    >а какую ошибку-то?

    Вот эту: #1222 - The used SELECT statements have a different number of columns
     
  7. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    я так понимаю в search_list содержится один столбец,а в comments большее количество?
    тогда либо урежьте возвращаемые поля comments до 1-го
    либо дополните пустыми полями первые два запроса.

    а вообще, для чего вам понадобилось объединять разные по структуре таблицы?
    Если вы пытаетесь таким образом "оптимизировать" свою программу, то это вы зря.
    в скрипте больше времени уйдет на проверку, какой тип данных у нас вернулся в этой строке резльтата.
    лучше первые два запроса объедените, а последний сделайте отдельным
     
    rsha1988 нравится это.
  8. rsha1988

    rsha1988

    Регистр.:
    7 апр 2006
    Сообщения:
    550
    Симпатии:
    133
    Немного больше ... в search_list 4 столба а в comments 7 столбов ...
    Да... для своеобразной оптимизации так как скрипт делает около 6 sql запросов и это еще не предел... 3 sql запроса уходят только на один блок......
     
  9. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    если вы считаете, что это большое количество запросов, или что из-за них появится бОльшая нагрузка, вы ошибаетесь
    преждевременная оптимизация
    запросы должны объединятся логически, а не с целью уменьшения количества запросов.
    вы сможете на такой оптимизации реально сэкономить(наверно.может и в такой ситуации не удастся), только если ваш SQL-сервер - отдельная машина. В иных ситуациях, скорость будет такая же запроса, более того вы увеличиваете нагрузка на PHP, заставляя его анализировать разномастные данные.
    к тому же нагрузка на SQL-сервер в случае использования объединений UNION ALL будет одинакова с нагрузкой двух отдельных запросов.а нагрузка UNION будет больше чем любая из них, по причине сортировки, и удаления дублей
    В общем, сильно не советую делать такую оптимизацию.
     
  10. rsha1988

    rsha1988

    Регистр.:
    7 апр 2006
    Сообщения:
    550
    Симпатии:
    133
    Ладно, спасибо вам большое за помощь.
    Если нормального выхода из подобной ситуации нету то тогда буим юзать union.... ведь из таблице "comments" мне кокракс всего 4 ячейки нужно =)
     
Статус темы:
Закрыта.