[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с SQL-запросом
panacea
Что-то туплю по страшному. Не могу сварганить запросик. blink.gif
Вот написал запрос, который возвращает данные пользоватля если он публиковал новости в определенной категории (DLE):

SELECT name, user_id, email, news_num, comm_num, info, foto, fullname, land FROM cms_users WHERE name IN (SELECT autor FROM cms_post WHERE category=2) ORDER BY news_num, name LIMIT 0,10;

Теперь хочу сделать еще и вывод заголовка (title) последней новости пользователя с формированием ссылки. Для этого нужно из таблицы cms_post вытащить поля id, title, date.
Дата нужна так как я хочу еще и сотрировать по ней.
Я могу это сделать, но отдельным запросом. А это бэд, надо вместить в один запрос.
Помогите плиз.



Спустя 12 минут, 13 секунд (9.01.2011 - 18:15) sergeiss написал(а):
Почитай в хэлпе про JOIN - позволяет как раз выбрать данные из нескольких таблиц (из 2-х и более), связав их по ключевым полям.
Ничего сложного нету smile.gif Один раз научишься - будет потом легко и просто пользоваться.

Спустя 27 минут, 55 секунд (9.01.2011 - 18:43) panacea написал(а):
Спасибо. Будем искать.

Спустя 3 часа, 46 минут, 52 секунды (9.01.2011 - 22:30) panacea написал(а):
Не могу придумать как дубликаты по имени убрать. unsure.gif

SELECT u.name, u.user_id, u.email, u.news_num, u.comm_num, u.info, u.foto, u.fullname, u.land, p.id, p.title, p.category FROM dle_users u JOIN dle_post p ON u.name=p.autor WHERE p.category=2 ORDER BY p.id DESC

Подскажите, как это можно сделать?

Спустя 12 минут, 27 секунд (9.01.2011 - 22:43) sergeiss написал(а):
Убрать дубликаты - DISTINCT

Спустя 6 минут, 29 секунд (9.01.2011 - 22:49) panacea написал(а):
Я пробовал уже. Не помогло
SELECT DISTINCT(u.name), u.user_id, u.email, u.news_num, u.comm_num, u.info, u.foto, u.fullname, u.land, p.id, p.title, p.category FROM dle_users u JOIN dle_post p ON u.name=p.autor WHERE p.category=2 ORDER BY p.id DESC

Спустя 22 часа, 54 минуты, 40 секунд (10.01.2011 - 21:44) panacea написал(а):
Не выходит. Никто не знает как это еще можно сделать?

Спустя 2 часа, 8 минут, 5 секунд (10.01.2011 - 23:52) sergeiss написал(а):
Цитата (panacea @ 10.01.2011 - 22:44)
Не выходит.

А что именно выходит-то?

Спустя 12 минут, 44 секунды (11.01.2011 - 00:05) panacea написал(а):
Дубли хочу убрать по авторам.
Вывод производит, но хочу лишь последние статьи авторов, а не все.

Спустя 9 минут, 6 секунд (11.01.2011 - 00:14) sergeiss написал(а):
Вот это
Цитата (panacea @ 9.01.2011 - 23:30)
Не могу придумать как дубликаты по имени убрать.

и это
Цитата (panacea @ 11.01.2011 - 01:05)
Вывод производит, но хочу лишь последние статьи авторов, а не все.

"две большие разницы". Тебе не кажется?

Спустя 1 минута, 42 секунды (11.01.2011 - 00:15) panacea написал(а):
Согласен. Ввел в заблуждение. Прошу прощения.
Как вы думаете такая конструкция может быть эффективной?
_http://www.sql.ru/articles/mssql/2005/030401SpeedUpSELECT_DISTINCTqueries.shtml

Спустя 9 часов, 16 минут, 30 секунд (11.01.2011 - 09:32) linker написал(а):
panacea
Ну так что тебе нужно на самом деле, это
Цитата
Не могу придумать как дубликаты по имени убрать.
или это
Цитата
Вывод производит, но хочу лишь последние статьи авторов, а не все.

Спустя 44 минуты, 52 секунды (11.01.2011 - 10:17) panacea написал(а):
Нужно вывод данных пользователя и сформировать ссылку на последнюю статью, из определенной категории новостей (WHERE p.category=2). Без дублей - это значит нужно видеть только уникальные имена авторов, которые написали там статью.

Спустя 3 часа, 29 минут, 46 секунд (11.01.2011 - 13:47) linker написал(а):
Вложенный запрос тебе поможет. Есть еще варианты, но они зависят уже от PHP-кода.

Спустя 5 часов, 46 минут, 9 секунд (11.01.2011 - 19:33) panacea написал(а):
А подробнее можно. Скрипт для блога на DLE

Спустя 53 минуты, 42 секунды (11.01.2011 - 20:26) sergeiss написал(а):
Тут (для меня) проблема в том, что с MySQL я не работаю. А только с Постгре. Синтаксис у них немного отличается, особенно когда хочется каких-то "изысков".

На Постгре такой запрос сделать легко.
Вот есть такая таблица
CREATE TABLE "statistics"
(
script text,
referrer text,
date_ date,
time_ time without time zone,
ip character(15),
userid integer DEFAULT 0
)

В ней находится вся статистика обращений юзеров к сайту.
Если я сделаю такой запрос
select distinct on (userid) userid, time_ from statistics where date_='2010-02-19'
order by userid, time_ desc

то получу только одну запись для каждого пользователя, причем с максимальным временем обращения, т.е. когда он последний раз обращался в указанный день.

Запрос так работает:
1. Выбираются все данные за определенный день.
2. Для каждого юзера данные идут подряд, причем в порядке убывания времени. Затем данные другого юзера и т.д.
3. Затем выбирается одна уникальная запись для каждого юзера, т.е. первая. А первой в блоке записей одного юзера как раз находится запись с максимальным временем. Она и выводится в окончательный результат.

Если убрать DESC, то тогда будет сделана подобная выборка, только время будет самым первым временем обращения юзера в этот день.

А тебе я предлагаю подумать (и попробовать!), можно ли что-то подобное организовать на MySQL. Подсказка: в качестве таблицы может использоваться запрос, объединяющий данные из нескольких таблиц (а чем намекал linker), т.е. "вложенный запрос".

Спустя 20 часов, 12 минут, 15 секунд (12.01.2011 - 16:39) panacea написал(а):
Да видно в мускуле дистинкт слабоват. Даже такой запрос не может уникализировать.

SELECT DISTINCT (p.autor), p.id, p.title, p.category FROM dle_post p WHERE p.category=2 ORDER BY p.id
Как же быть? Я в упор не пойму какой подзапрос писать уже...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.