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

Статус
В этой теме нельзя размещать новые ответы.

rsha1988

Постоялец
Регистрация
7 Апр 2006
Сообщения
553
Реакции
146
Привет всем.

Есть две 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:
 
А UNION оператор смотрел?
*** скрытое содержание ***

Пробывал!
Но почему то :
Код:
(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)

-вызывает ошибку на третьем запросе
 
две таблицы можно объединять тогда и только тогда, когда:
  1. они имеют одинаковое число столбцов, например, m;
  2. для всех i (i = 1, 2, ..., m) i-й столбец первой таблицы и i-й столбец второй таблицы имеют в точности одинаковый тип данных
Для просмотра ссылки Войди или Зарегистрируйся

А вложенный запрос
Код:
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
смотрел?
 
а какую ошибку-то?
может напишите ее номер, и сообщение ошибки?
[telepatemod]
в таблицах search_list и comments одинаковое количество столбцов?
скорее всего нет, поэтому и ошибка.в UNION все результаты должны иметь одинаковое количество полей.
попробуйте вместо * указать конкретные поля, так чтобы их количество везде совпадало
[/telepatemod]

2 KillDead
А вложенный запрос
Код:
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
смотрел?
что по вашему должен сделать этот запос?
насколько я помню вложенные SELECT-ы могут использоватся в качестве значений, если возвращают одну строку
короче говоря этот запос не должен работать, насколько мне известен MySQL
 
А вложенный запрос
Код:
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
смотрел?

Таблицы 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
 
я так понимаю в search_list содержится один столбец,а в comments большее количество?
тогда либо урежьте возвращаемые поля comments до 1-го
либо дополните пустыми полями первые два запроса.

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

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

Немного больше ... в search_list 4 столба а в comments 7 столбов ...
Да... для своеобразной оптимизации так как скрипт делает около 6 sql запросов и это еще не предел... 3 sql запроса уходят только на один блок......
 
если вы считаете, что это большое количество запросов, или что из-за них появится бОльшая нагрузка, вы ошибаетесь
Для просмотра ссылки Войди или Зарегистрируйся
запросы должны объединятся логически, а не с целью уменьшения количества запросов.
вы сможете на такой оптимизации реально сэкономить(наверно.может и в такой ситуации не удастся), только если ваш SQL-сервер - отдельная машина. В иных ситуациях, скорость будет такая же запроса, более того вы увеличиваете нагрузка на PHP, заставляя его анализировать разномастные данные.
к тому же нагрузка на SQL-сервер в случае использования объединений UNION ALL будет одинакова с нагрузкой двух отдельных запросов.а нагрузка UNION будет больше чем любая из них, по причине сортировки, и удаления дублей
В общем, сильно не советую делать такую оптимизацию.
 
Ладно, спасибо вам большое за помощь.
Если нормального выхода из подобной ситуации нету то тогда буим юзать union.... ведь из таблице "comments" мне кокракс всего 4 ячейки нужно =)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху