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

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

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 191
  • Публикации: 3624
Re: Вземане на последният пост към всяка тема
« Отговор #15 -: 18 Ноември 2014, 14:39:43 »
Ами в такъв случай не виждам смисъл от тази колона в таблицата - "cat" в topics освен ако идеята не е да показваш кой топик към коя категория принадлежи, но то тогава ще трябва и отделна таблица с категории да речем да имаш. Както и да е ако имам време ще направя една примерна скимата с няколко таблици вързани логично една към друга или някой друг би могъл да го направи няма лошо.

Цитат
По принцип ID-то е уникална стойност и има auto_increment, което също може да ти свърши работа за определяне на най-новия пост.
Да разбирам, че препоръчваш да се ползва auto_increment за извличане на последният резултат или по принцип е добре да има auto_increment колона в таблицата? Щото аз смятам, че и двете са грешни и не трябва да се ползват.

Наборе, дай малко тълкуване / разяснение в/у заявката и по специално в/у where clause-та. Тва вижда ли ти се логично  - where post_topic_id = topic_id? Няма JOIN, няма ON или exists condition. 


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: Вземане на последният пост към всяка тема
« Отговор #16 -: 18 Ноември 2014, 14:45:37 »
Цитат
Ами в такъв случай не виждам смисъл от тази колона в таблицата - "cat" в topics освен ако идеята не е да показваш кой топик към коя категория принадлежи, но то тогава ще трябва и отделна таблица с категории да речем да имаш.
A....прав си. Тотално съм отишъл в киреча  :(

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Вземане на последният пост към всяка тема
« Отговор #17 -: 18 Ноември 2014, 16:26:37 »
Наборе, допуснал съм една грешчица, вместо запетая съм писал точка. Значи трябва да изглежда така:
Код: 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)
Наборе, за да работиш с повече от една таблици, не е задължително да се ползва JOIN. Това е доста проста заявка и затова не ги ползвам!
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

Avalanche

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

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #19 -: 19 Ноември 2014, 03:05:26 »
Добре нека да внеса малко яснота какво взъщност се случва. Преработих и опростих малко таблиците.


mysql> SELECT * FROM sit.topics;
+----+-----------------------+-----+---------------------+-------+
| id | subject               | cat | created_at          | views |
+----+-----------------------+-----+---------------------+-------+
|  1 | Forum is closed       |   1 | 2014-03-12 02:49:58 |    37 |
|  2 | Count topic and posts |   2 | 2014-05-18 08:30:58 |     2 |
|  3 | Soccer                |   1 | 2014-06-10 12:30:58 |    57 |
|  5 | Test                  |   1 | 2014-07-12 03:34:32 |    23 |
|  6 | Games                 |   3 | 2014-08-12 06:05:54 |     4 |
|  7 | testing               |   4 | 2014-09-07 00:15:00 |    13 |
|  8 | boooo                 |   4 | 2014-10-02 00:29:00 |    15 |
|  9 | swap links            |   0 | 2014-10-19 00:38:00 |     2 |
| 10 | test 2                |   0 | 2014-11-06 02:20:00 |     3 |
+----+-----------------------+-----+---------------------+-------+
9 rows in set (0.00 sec)

mysql> SELECT * FROM sit.posts;
+----+------------+---------------------+----------+-----------+
| id | comment    | created_at          | topic_id | name      |
+----+------------+---------------------+----------+-----------+
|  1 | comment 1  | 2014-03-18 18:58:17 |        1 | babybliss |
|  2 | comment 2  | 2014-11-18 18:58:17 |        3 | babybliss |
|  3 | comment 3  | 2014-03-24 18:58:17 |        1 | slippers  |
|  4 | comment 4  | 2014-06-18 18:58:17 |        3 | slippers  |
|  5 | comment 5  | 2014-07-28 18:58:17 |        5 | thesit    |
|  6 | comment 6  | 2014-07-20 18:58:17 |        5 | thesit    |
|  7 | No comment | 2014-08-12 18:58:17 |        5 | joda      |
|  8 | Comment 8  | 2014-10-04 18:58:17 |        8 | testUser  |
|  9 | Comment 9  | 2014-10-09 18:58:17 |        8 | musicman  |
| 10 | No comment | 2014-11-18 18:58:17 |        8 | painter   |
| 11 | No comment | 2014-10-05 18:58:17 |        8 | painter   |
| 12 | Comment 12 | 2014-09-10 18:58:17 |        7 | rocky     |
| 13 | Comment 13 | 2014-09-11 18:58:17 |        7 | rocky     |
| 14 | Comment 14 | 2014-12-01 18:58:17 |        7 | superman  |
| 15 | Comment 15 | 2014-11-18 18:58:17 |        7 | superman  |
| 16 | No comment | 2014-11-18 18:58:17 |        0 | babyliss  |
+----+------------+---------------------+----------+-----------+
16 rows in set (0.00 sec)

Ако изпълня на HanKrum заявката получавам следният, неправилен при мен резултат

mysql> select
    t.subject, t.cat, p.comment, p.topic_id
from
    topics t,
    posts p
where
    p.created_at = (select
            max(posts.created_at)
        from
            posts
        where
posts.topic_id = t.id)
+-----------------+-----+------------+----------+
| subject         | cat | comment    | topic_id |
+-----------------+-----+------------+----------+
| Soccer          |   1 | comment 2  |        3 |
| boooo           |   4 | comment 2  |        3 |
| Forum is closed |   1 | comment 3  |        1 |
| Test            |   1 | No comment |        5 |
| Soccer          |   1 | No comment |        8 |
| boooo           |   4 | No comment |        8 |
| testing         |   4 | Comment 14 |        7 |
| Soccer          |   1 | Comment 15 |        7 |
| boooo           |   4 | Comment 15 |        7 |
| Soccer          |   1 | No comment |        0 |
| boooo           |   4 | No comment |        0 |
+-----------------+-----+------------+----------+

Резултата, който искам да изкарам е този

+-----------------+-----+------------+----------+
| subject         | cat | comment    | topic_id |
+-----------------+-----+------------+----------+
| Soccer          |   1 | comment 2  |        3 |
| Forum is closed |   1 | comment 3  |        1 |
| Test           |   1 | No comment |        5 |
| mooo           |   4 | No comment |        8 |
| testing         |   4 | Comment 14 |        7 |
+-----------------+-----+------------+----------+

Получавал съм нулев резултат преди, най-вероятно при промяната от timestamp към date. Видях доста полета с невалиден ден, месец и година.Ъпдейтнах тази колона да бъде с datetime type и съм променил името и от "timestamp" с "created_at". Също така някои колони съм ги премахнал, за да бъде по лесно четимо. Оставил съм "cat" както ме посъветва jazzman, ако реша да сложа таблица с категории.
« Последна редакция: 19 Ноември 2014, 03:09:20 от theSit »

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Вземане на последният пост към всяка тема
« Отговор #20 -: 19 Ноември 2014, 09:06:33 »
Покажи как си преработил заявката, защото имам чувството, че с едно GROUP  BY ще се реши проблема.
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #21 -: 19 Ноември 2014, 10:55:09 »
Покажи как си преработил заявката, защото имам чувството, че с едно GROUP  BY ще се реши проблема.
Aми това е -select
    t.subject, t.cat, p.comment, p.topic_id
from
    topics t,
    posts p
where
    p.created_at = (select
            max(posts.created_at)
        from
            posts
        where
posts.topic_id = t.id)

Пробвах и с group by но ефект голям няма -
select
    t.subject, t.cat, p.comment, p.topic_id
from
    topics t,
    posts p
where
    p.created_at = (select
            max(posts.created_at)
        from
            posts
        where
posts.topic_id = t.id
group by posts.topic_id)

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Вземане на последният пост към всяка тема
« Отговор #22 -: 19 Ноември 2014, 13:28:48 »
Код: MySQL
  1. SELECT MAX(post_time)  FROM posts,  topic WHERE post_topic_id = topic_id
Във вложената заявка във фром добави и другата  таблица, да видим дали ще запали.
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #23 -: 19 Ноември 2014, 13:41:30 »
Цитат
Error Code: 1146. Table 'sit.topic' doesn't exist   0.001 sec

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Вземане на последният пост към всяка тема
« Отговор #24 -: 19 Ноември 2014, 14:08:19 »
Цитат
Error Code: 1146. Table 'sit.topic' doesn't exist   0.001 sec

Е не става само с копи-пейст, трябва и да се напрегнеш малко!
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

theSit

  • Full Member
  • ***
  • Благодарности
  • -Казани: 18
  • -Получени: 3
  • Публикации: 152
Re: Вземане на последният пост към всяка тема
« Отговор #25 -: 19 Ноември 2014, 14:12:07 »
Цитат
Error Code: 1146. Table 'sit.topic' doesn't exist   0.001 sec

Е не става само с копи-пейст, трябва и да се напрегнеш малко!
Съжалявам. Видях, че трябва да бъде "topics" вместо "topic". Резултата е без промяна  :(

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 191
  • Публикации: 3624
Re: Вземане на последният пост към всяка тема
« Отговор #26 -: 19 Ноември 2014, 15:12:53 »
За да вземеш последният намерен постинг към всяка една категория:

1. Трябва да се направи JOIN върху it-то на топика с това от topic_id от пост.

2. Tрябва да се направи self join (temporary table) върху posts таблицата вземайки се в предвид датата на създаване групирайки ги по topic_id.

От предоставената от теб информация, аз получих следното:

Код: SQL
  1. SELECT
  2.    t.subject, t.cat, t.views, p.comment, p.topic_id
  3. FROM
  4.    topics t
  5.         INNER JOIN
  6.     posts p ON (t.id = p.topic_id)
  7.         INNER JOIN
  8.     (SELECT
  9.         topic_id, MAX(created_at) AS latest
  10.     FROM
  11.         posts
  12.     GROUP BY topic_id) AS x ON (p.topic_id = x.topic_id
  13.         AND p.created_at = x.latest
  14.  

Results:

Цитат
'Soccer', '1', '57', 'comment 2', '3'
'Forum is closed', '1', '37', 'comment 3', '1'
'Test', '1', '23', 'No comment', '5'
'boooo', '4', '15', 'No comment', '8'
'testing', '4', '13', 'Comment 14', '7'


NOTE: Вариантите да ползваш sub-queries е неприемвлив живеейки в 21век.

1. Кода е много по-трудно четим от този с JOIN syntax-a.

2. Бързодействието при голяма база с множество заявки е значително по-добро с JOIN.
 
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: Вземане на последният пост към всяка тема
« Отговор #27 -: 19 Ноември 2014, 15:30:55 »
Всичко изглежда нормално  :( Тва наистина е малко сложно за разбиране от мен и честно казано се бъркам често когато става дума за колони и редове в таблици.

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Вземане на последният пост към всяка тема
« Отговор #28 -: 19 Ноември 2014, 17:22:42 »
Един съвет. Преди да продължиш е хубаво да разгледаш уроците за mysql на сайта, за да ти се изяснят нещата. Гледам, че момчетата са ти обяснили максимално добре нещата, но просто има една начална теория, която трябва да я научиш и разбереш. 

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Вземане на последният пост към всяка тема
« Отговор #29 -: 19 Ноември 2014, 17:54:22 »
Момчето дори и да ги е гледал, като няма нищо за INNER, JOIN, LEFT и т.н., няма да разбере, кой знае колко от обясненията, а просто ще ги копира!
Нека знаещите и можещите да направят нещо по въпроса, аз съм от "Само си мисля, че знам"!
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой