Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите с SQL запросом / 8 сообщений из 8, страница 1 из 1
10.12.2008, 13:48
    #35705329
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
Приветствую!

У меня есть блог работающий на MovableType и Pgsql
Мне нужно из базы этого блога в другом месте сайта вывести 10 последних записей - т.е. название записи и ссылка на нее.
Я совсем не силен в вопросах SQL, поэтому буду признателен за помощь!

Читая всякие маны, я уже узнал как нужно подключится к базе и вывел из нее ряд требуемых характеристик.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
$connection = pg_connect ("host=$host dbname=$db user=$user password=$pass");
if (!$connection)
{
die("Could not open connection to database server");
}

$query = "SELECT entry_title, entry_id, entry_class, entry_authored_on, entry_basename FROM mt_entry ORDER BY entry_authored_on";

$result = pg_query($connection, $query) or die("Error in query: $query. " . pg_last_error($connection));
// get the number of rows in the resultset
$rows = pg_num_rows($result);

// if records present
if ($rows >  0 )
{
// iterate through resultset
for ($i= 0 ; $i<$rows; $i++)
{
$row = pg_fetch_row($result, $i);
?>
<li><font size="-1"><b><? echo $row[ 0 ]; ?></b></font>
<br>
<font size="-1"><? echo $row[ 1 ]; ?><br>/<? echo $row[ 2 ]; ?>/<? echo $row[ 3 ]; ?>/<? echo $row[ 4 ]; ?></font>
<p>
<?
}
}
// if no records present
else
{
?>
<font size="-1">No data available.</font>
<?
}

pg_close($connection);

entry_title - это название
entry_id - идешник записи
entry_class - это тип записи (может быть запись - entry, а может быть страницей - page)
entry_authored_on - это дата публикации
entry_basename - это урл странички, например name_docs

А вот дальше у меня начинаются сложности.
1) Мне нужно получить данные отсортированные по дате, т.е. сперва идут новые. В запросе я поставил ORDER BY entry_authored_on - но он почему то не срабатывает. У меня в списке выводятся новые записи в самом конце. Хотя entry_authored_on - приходит в таком формате 2008-11-18 15:59:40

2) Следующий момент, мне нужно получить только записи у которых entry_class == "entry", т.е. только записи без статичных страничек.

3) Мне нужно вывести тока 10 последних записей. Сейчас приходят все записи

4) Наконец самая большая сложность - сформировать правильный урл.
В блоге у записи урл такого вида = /имя_раздела/имя_записи.html
В таблице mt_entry есть тока "имя_записи" (entry_basename), как получить "имя_раздела" в которой запись находится ума не приложу. Наверно это находится в другой таблице mt_category, но как это узнать...

Спасибо, что прочитали.
Буду благодарен за любую помощь и совет!
...
Рейтинг: 0 / 0
10.12.2008, 19:10
    #35706537
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
Покопался, вот что написал для решения первых 3-х пунктов по своей задаче.

Код: plaintext
$query = "SELECT entry_title, entry_text, entry_authored_on, entry_basename, mt_placement.placement_category_id FROM mt_entry, mt_placement WHERE entry_id = mt_placement.placement_entry_id AND entry_class = 'entry' ORDER BY entry_authored_on DESC";

Т.е. по
1) сортировку получил за счет использования: ORDER BY entry_authored_on DESC
Не понятно, почему сортировка ведет себя так странно, не похоже что entry_authored_on приходит строкой...
2) отделил "записи" от "страниц" посредством WHERE entry_class = 'entry'
3) 10-у записей вывел в лоб, указав цикл итерации 10, т.е. for ($i=0; $i<10; $i++)
Совсем не уверен, что это правильно, но другого способа я не знаю.

Касательно 4-го пункта - вопрос еще решаю.
Там картина такая. Нужные мне данне хранятся в 3 таблицах
1) mt_entry - содержит данные о записи
2) mt_placement - содержит привязки записи с категорией
3) mt_category - содержит данные о самой категории, в моем случае нужный мне урл.

Думаю, что перед основной итерацией нужно сгенерировать массив с данными по категории (идешник/урл). И потом в самой итерации брать mt_placement.placement_category_id (по сути это идешник категории) и по нему из массива извлекать урл и подставлять в ссылку.

Я правильно мыслю или есть более оптимальный вариант?
...
Рейтинг: 0 / 0
10.12.2008, 19:22
    #35706561
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
@NET
3) 10-у записей вывел в лоб, указав цикл итерации 10, т.е. for ($i=0; $i<10; $i++)
Совсем не уверен, что это правильно, но другого способа я не знаю.

LIMIT в запросе.

@NET
Думаю, что перед основной итерацией нужно сгенерировать массив с данными по категории (идешник/урл). И потом в самой итерации брать mt_placement.placement_category_id (по сути это идешник категории) и по нему из массива извлекать урл и подставлять в ссылку.

Я правильно мыслю или есть более оптимальный вариант?
Есть, надо использовать соединение таблиц. В интернетах же наверняка есть куча самоучителей SQL, что мешает почитать?
...
Рейтинг: 0 / 0
10.12.2008, 19:27
    #35706569
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
Ух :) решил и 4-й пункт.
Во как надо
Код: plaintext
$query = "SELECT e.entry_title, e.entry_text, e.entry_authored_on, e.entry_basename, e.entry_id, p.placement_entry_id, p.placement_category_id, c.category_id, c.category_basename FROM mt_entry e, mt_placement p, mt_category c WHERE  (e.entry_id = p.placement_entry_id) and (p.placement_category_id = c.category_id) and e.entry_class = 'entry' ORDER BY e.entry_authored_on DESC";

Осталось подумать как оптимизировать сам запрос, чтоб брать тока первые 10-ть записей, а не все.
...
Рейтинг: 0 / 0
10.12.2008, 19:31
    #35706575
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
Sad Spirit@NET
3) 10-у записей вывел в лоб, указав цикл итерации 10, т.е. for ($i=0; $i<10; $i++)
Совсем не уверен, что это правильно, но другого способа я не знаю.

LIMIT в запросе.

Спасибо за наводку, буду копать в этом направлении!

Sad Spirit
Есть, надо использовать соединение таблиц. В интернетах же наверняка есть куча самоучителей SQL, что мешает почитать?

Почитать то ничего не мешает, другое дело, что толково написанных, да с хорошими примерами - очень мало. А уж если речь идет о сложных связках - то ваще.
...
Рейтинг: 0 / 0
10.12.2008, 20:00
    #35706632
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
Усе, сделал все 4-ре пункта и все в одной строке запроса.

Код: plaintext
$query = "SELECT e.entry_title, e.entry_text, e.entry_authored_on, e.entry_basename, e.entry_id, p.placement_entry_id, p.placement_category_id, c.category_id, c.category_basename FROM mt_entry e, mt_placement p, mt_category c WHERE  (e.entry_id = p.placement_entry_id) and (p.placement_category_id = c.category_id) and e.entry_class = 'entry' ORDER BY e.entry_authored_on DESC LIMIT 10";
...
Рейтинг: 0 / 0
11.12.2008, 11:34
    #35707591
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
@NET1) сортировку получил за счет использования: ORDER BY entry_authored_on DESC
Не понятно, почему сортировка ведет себя так странно, не похоже что entry_authored_on приходит строкой...если тип entry_authored_on строковый, а сортировка нужна числовая, то попробуйте сделать приведение к типу: ORDER BY entry_authored_on::integer DESC
...
Рейтинг: 0 / 0
19.12.2008, 10:22
    #35723907
@NET
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с SQL запросом
LeXa NalBat,
ok, спасибо за пример, попробую!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите с SQL запросом / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]