Написани и получени коментари/съобщения

metal_head

Registered
И така, дойде време да правя система за коментари. В сайта ми, потребителите могат да пишат новини, ревюта, да качват видеота и още доста такива. За всяко такова нещо си има таблица reviews, news, videos ..etc.

Искам да напиша и система за коментари към всичко това. Ето плана:
Потребителят поства коментара. В таблицата с коментари се записват името му, към какво е коментара (ревюта, новини, видеота) и ID-то на дадения артикул. До тук добре, нищо сложно. Проблема идва сега. Искам да направя система, която показва написаните от потребителя коментари и получените коментари. Написаните ще е лесно, но получените става малко трудно, защото един потребител може да пуска доста различни типове съдържание в сайта. Как ще мога да взема само коментарите, които се отнасят към артикули, постнати от даден потребител? За целта трябва да имам още едно поле в базата, да речем receiver и системата да взима потребителя, който е постнал съдържанието от базата данни със съдържанието (отново reviews, news, videos) и да го запиша в коментара, но няма ли по-лесен начин.

Подобен ми е и въпроса за личните съобщения. По PHPBB форумите потребителите могат да си виждат изпратените съобщения и да ги редактират. Освен това, могат да си виждат получените съобщения и да ги трият. Проблемът е, че като имам един запис с едно съобщение, той съдържа подател, получател, дата..примерно, индикатор дали е прочетено и съобщението. В момента, в който получателя получи съобщението, той може да го изтрие. Ако получателя изтрие записа със съобщението от базата данни, подателя ще го изгуби от списъка с изпратени. Тук решението, което ми идва на акъла е да има още 2 полета, които да обозначават коя от страните е изтрила съобщението и ако и двете страни са изтрили съобщението, тогава то наистина да се изтрива от базата данни.

Въобще, тези идеи, които имам правилни ли са, защото имам чувството, че всичко това може да стане по друг начин.
 
По първия въпрос - не е добра идея да слагаш id на автора на материала в таблицата с коментарите, защото това е повторение на информацията и бягаш от идеята за нормализация на базата данни. Можеш да изведеш коментарите, които имат отношение към определен автор, но това няма да стане с обикновенна заявка, а с join - свързване на таблиците.

Ако приемем, че ревютата са в таблица reviews, коментарите в таблица comments и потребителите - в таблица users, заявката ти е нещо от вида на:

[sql]
SELECT comments.*
FROM comments
LEFT JOIN reviews on reviews.id = comments.review_id
LEFT JOIN users on reviews.autor_id = users.id AND users.id = '$autor_id'

WHERE comments.type = 'reviews'
[/sql]
 
Ох, ами малко се обърках тук, защото LEFT JOIN все още ми е трудно да го схвана напълно. Схващам цялостната му идея, но може ли да те помоля да ми обясниш всеки ред от заявката какво точно прави и какво оказва. Просто ми се иска да знам за какво става въпрос, а не само да го копирам :)
 
Дали LEFT или INNER join, мисля, че в случая при така написана заявка, ще ти даде едни и същи резулатати. Всъщност втория join може да се махне, ако няма да показваш информация за автора като името му например.

[sql]
SELECT comments.*
FROM comments
LEFT JOIN reviews on reviews.id = comments.review_id and reviews.autor_id = '$user_id'

WHERE comments.type = 'reviews'
[/sql]

Когато трябва да пишеш сложна заявка, започваш от най-елементарния вариант и постепенно добавяш условия


[sql]
//покажи ми всички коментари на ревютата
SELECT comments.*
FROM comments
WHERE comments.type = 'reviews'
[/sql]

[sql]

//покажи ми всички ревютата, които са написани от автор номер 3
SELECT reviews.*
FROM reviews
WHERE reviews.autor_id = 3
[/sql]

и после ги обединяваш:

[sql]
//покажи ми всички коментари на ревютата, които са написани от автор номер 3
SELECT comments.*
FROM comments
LEFT JOIN reviews on comments.review_id = reviews.id and reviews.autor_id = 3
WHERE comments.type = 'reviews'
[/sql]

или пък същото, но написано по друг начин:

[sql]
SELECT comments.*
FROM comments, reviews
WHERE
(comments.autor_id = reviews.autor_id) AND
(comments.type = 'reviews')

[/sql]
 

Back
Горе