Автор Тема: Вземане на последният пост към всяка тема  (Прочетена 21228 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Здравейте. Опитвам се да направя малък форум с теми и към всяка отворена тема да има "N" постове към нея. Сега на въпроса. Как мога от тези две таблици да извлеча последният пост към всяка тема, ако има вече наличен такъв? 

Код: PHP
  1. mysql> show columns from topics;
  2. +-----------+--------------+------+-----+-------------------+-----------------------------+
  3. | Field     | Type         | Null | Key | Default           | Extra                       |
  4. +-----------+--------------+------+-----+-------------------+-----------------------------+
  5. | id        | int(8)       | NO   | PRI | NULL              | auto_increment              |
  6. | subject   | varchar(255) | NO   |     | NULL              |                             |
  7. | cat       | int(8)       | NO   | MUL | NULL              |                             |
  8. | timestamp | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
  9. | name      | varchar(255) | NO   |     |                   |                             |
  10. | text      | text         | NO   |     | NULL              |                             |
  11. | views     | int(11)      | NO   |     | 0                 |                             |
  12. +-----------+--------------+------+-----+-------------------+-----------------------------+
  13. 7 rows in set (0.01 sec)
  14.  
  15. mysql> show columns from posts;
  16. +-----------+------------------+------+-----+-------------------+-----------------------------+
  17. | Field     | Type             | Null | Key | Default           | Extra                       |
  18. +-----------+------------------+------+-----+-------------------+-----------------------------+
  19. | id        | int(8)           | NO   | PRI | NULL              | auto_increment              |
  20. | comment   | text             | NO   |     | NULL              |                             |
  21. | timestamp | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
  22. | topic     | int(11) unsigned | NO   |     | NULL              |                             |
  23. | name      | varchar(255)     | NO   |     |                   |                             |
  24. +-----------+------------------+------+-----+-------------------+-----------------------------+
  25. 5 rows in set (0.00 sec)
  26.  

ID-то от topic таблицата е вързано към topic от posts, а cat от topics  таблицата е вързано с id-то на posts таблицата.
« Последна редакция: 16 Ноември 2014, 15:49:16 от theSit »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #1 -: 16 Ноември 2014, 17:12:00 »
Хубаво е да имаш поле с дата на добавяне, по което да определиш кой е най-новия пост. По принцип ID-то е уникална стойност и има auto_increment, което също може да ти свърши работа за определяне на най-новия пост. Сортираш по това поле и ползваш LIMIT да вземеш само най-пресния пост. Тоя timestamp за какво е? С тая екстра не виждам много смисъл от него.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Вземане на последният пост към всяка тема
« Отговор #2 -: 16 Ноември 2014, 18:22:05 »
Код: MySQL
  1. >TABLE topics:
  2. >>  topic_id INT A/I
  3. >>  topic_subject VARCHAR
  4. >>  topic_time INT
  5. >>  topic_name VARCHAR
  6. >>  topic_text TEXT
  7. >>  topic_views INT
  8. >>>>>>>>>>>>>
  9. >TABLE posts:
  10. >> post_id INT A/I
  11. >> post_comment TEXT
  12. >> post_time INT
  13. >> post_topic_id INT
  14. >> post_name VARCHAR
  15. >>>>>>>>>>>>>
  16.     topic_id,
  17.     topic_subject,
  18.     topic_time,
  19.     topic_name,
  20.     topic_text,
  21.     topic_views,
  22.     post_id.
  23.     post_comment,
  24.     post_time,
  25.     post_topic_id,
  26.     post_name
  27. FROM topics, posts
  28. WHERE post_time = (SELECT
  29.                        MAX(post_time)
  30.                    FROM posts
  31.                    WHERE post_topic_id = topic_id)

Забележка: За topic_time и post_time трябва да са от функцията time();
                    Ползвай префикси за базите, таблиците и колоните, за да не се налага да изписваш и таблицата за всяка колона в заявката
« Последна редакция: 16 Ноември 2014, 18:26:45 от HanKrum »
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #3 -: 17 Ноември 2014, 09:50:41 »
ХанКрум, опитах се да пренапиша заявката съобразявайки се моите таблици, но извежда празен резултат. Няма грешки, но няма и резултат  >:(

Код: SQL
  1. SELECT
  2.     t.cat, t.text, p.comment, p.topic, p.TIMESTAMP
  3. FROM
  4.     topics t, posts p
  5. WHERE p.TIMESTAMP = (SELECT
  6.                        MAX(posts.TIMESTAMP)
  7.                    FROM posts
  8.                    WHERE t.id = p.topic)
  9.  

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #4 -: 17 Ноември 2014, 19:56:40 »
Още тук на тази палитра ясно се вижда, че timestamp е запазена дума. Ще береш ядове с нея.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #5 -: 17 Ноември 2014, 20:13:01 »
Още тук на тази палитра ясно се вижда, че timestamp е запазена дума. Ще береш ядове с нея.
Ще я променя щом е запазена дума. Не знаех. Но грешки няма. Идеи, защо извежда празен резултат?
« Последна редакция: 17 Ноември 2014, 20:17:43 от theSit »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #6 -: 17 Ноември 2014, 20:36:24 »
Ми дебъгвай :)
Аз бих избрал по-съвременния синтаксис с JOIN-ове.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #7 -: 17 Ноември 2014, 20:48:23 »
Ми дебъгвай :) Аз бих избрал по-съвременния синтаксис с JOIN-ове.
Добре де, редно ли е да получа празен резултат, при положение че ХанКрум получава друго с подобна по структура таблица(и)? Инструмент за дебъгване ли трябва да инсталирам?

Цитат
Още тук на тази палитра ясно се вижда, че timestamp е запазена дума.
Не трябва ли да получа синтакс еррор ако е такава? Тук не я виждам, но въпреки това и без нея положението е същото.
« Последна редакция: 17 Ноември 2014, 21:21:25 от theSit »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #8 -: 17 Ноември 2014, 21:32:35 »
Не ти трябва тулове за дебъг като знаеш как работят нещата. Разделяш кодът на парчета и гледаш къде се дъни! Ако не можеш да се справиш с тази задача, направи един fiddle - http://sqlfiddle.com/
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #9 -: 17 Ноември 2014, 21:42:37 »
Разбрах и благодаря. То, ако знам защо, къде и какво се дъни бих могъл и сам да намеря решението. От друга страна ви казвам, че с тази заявка получавам празен резултат и питам знаещите защо това се случва? Грешна логика ли имам? Нещо нередно ли има  нея? Или нещо което не разбирам се опитвам да направя? Относно фидъла, не ми се поства информация с над 150 реда записи в нея. 

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #10 -: 17 Ноември 2014, 22:20:31 »
Не ни и трябват 150 реда, 5 са достатъчни. Това последното прозвуча точно като един лаф, с който се бъзикаме с Питанката - че хвърляме боб и така разбираме къде са проблемите в кода. В тоя код дето си написал имаш една външна заявка и една вложена.

Още преди ти намекнах да ги отделиш и да тестваш на парче. Анализирай заявките - вложената ти връща един запис (най-новия) и по него сравняваш на WHERE клаузата към външната заявка. Харесай си един topic, вземи му ID-то, намери един post към него, вземи и неговото ID. Сега отдели вложената заявка и изпълни само нея като в WHERE клаузата сложиш съответните ID-та. Пак ли няма резултат? Ако има значи проблема не е тука, минаваш към външната заявка и така докато не намериш къде по дяволите се е скрило малкото гадно нещо...
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #11 -: 17 Ноември 2014, 22:40:25 »
Aваланш мислех, че информацията от таблиците е достатъчна за да се изгради заявката. Както и да е, утре (вече е късно) ще публикувам и някаква реална, опростена информация щом така ще е по лесно.

Цитат
Анализирай заявките - вложената ти връща един запис (най-новия) и по него сравняваш на WHERE клаузата към външната заявка
Точно това не разбирам, защо получавам празен резултат, при положение че тя съществува ???
« Последна редакция: 17 Ноември 2014, 22:43:28 от theSit »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #12 -: 17 Ноември 2014, 23:08:20 »
Aваланш мислех, че информацията от таблиците е достатъчна за да се изгради заявката.
Еми достатъчна е разбира се, нали си ги изградил вече. Въпроса е къде се дъни. Фатката не е да ти се напише някакво решение и ти просто да ей така - хоп да го сложиш и да работи. Нали утре пак ще трябва да пишеш заявка, ако не схванеш идеята и не можеш сам да вникнеш в проблема и да намериш някакво решение, какво правим...
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 191
  • Публикации: 3624
Re: Вземане на последният пост към всяка тема
« Отговор #13 -: 18 Ноември 2014, 01:34:52 »
Какъв relationship има между таблиците? Аз съм леко объркан, как е възможно ID-то от topic таблицата е вързано към topic от posts (това го разбирам) и в същото време "cat" от "topics"  таблицата да е вързано с id-то на posts  ??? Ако те разбирам правилно, 1 топик (thread) може да има multiple posts, но 1 post не може да принадлежи към няколко теми. Или се лъжа?   
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #14 -: 18 Ноември 2014, 10:55:51 »
Не. Не се лъжеш  >:(