|
|
|
| Есть база в ней несколько таблиц news,coments,users и т.д
Таблица comments содержит поля: id,news_id,author,comment
Помогите сделать один запрос который выведит комментарии к новости например с id =17 и кол-во комментарий у авторов комментов | |
|
|
|
|
|
|
|
для: fiper
(23.07.2007 в 03:01)
| | Можно воспользоваться следующим запросом
SELECT id,news_id,author,comment
FROM comments
WHERE id =17
|
| |
|
|
|
|
|
|
|
для: cheops
(23.07.2007 в 11:04)
| | Это понятно. а где кол-во комментарий у автора? | |
|
|
|
|
|
|
|
для: fiper
(23.07.2007 в 11:46)
| | Это лучше делать отдельным запросом - поле author что из себя представляет? | |
|
|
|
|
|
|
|
для: cheops
(23.07.2007 в 11:50)
| | Поле author varchar(255)
А отдельным запром наверно как то так
SELECT count( news_id )
FROM comment WHERE author='$author'
|
Лучше конечно одним запросом , так как вывод новости один select + вывод комментов + подсчёт комментов | |
|
|
|
|
|
|
|
для: fiper
(23.07.2007 в 03:01)
| | нужно знать структуру таблиц. | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2007 в 11:07)
| | Структура таблиц
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`date` int(11) NOT NULL default '0',
`lev` smallint(6) NOT NULL default '3',
`login` varchar(255) NOT NULL default '',
`pass` varchar(255) NOT NULL default '',
`forgot_p` varchar(50) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`email` varchar(255) NOT NULL default '',
`avatar` varchar(255) NOT NULL default '',
`last_enter` int(11) NOT NULL default '0',
`ban` smallint(6) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `login` (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `news` (
`date` int(11) NOT NULL default '0',
`title` varchar(255) NOT NULL default '',
`short` text NOT NULL,
`full` text NOT NULL,
`cat` smallint(6) NOT NULL default '0',
`url_n` varchar(255) NOT NULL default '',
`img` text NOT NULL,
`links` text NOT NULL,
`id` int(11) NOT NULL auto_increment,
`view` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `url_n` (`url_n`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `comment` (
`id` mediumint(9) NOT NULL auto_increment,
`news_id` smallint(11) NOT NULL default '0',
`author` varchar(255) NOT NULL default '',
`mail` varchar(255) NOT NULL default '',
`comment` text NOT NULL,
`comment_admin` text NOT NULL,
`date` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `news_id` (`news_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
|
| |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 16:58)
| | не вижу в таблице comment чужого ключа в таблицу users
поправка.
Вообще ни одного чужого ключа, который бы опирался на первичные, не вижу
SELECT comments.*, cmt_cnt
FROM comments
JOIN (
SELECT COUNT(id) AS cmt_cnt, cmt_auth FROM comments GROUP BY author)
AS tc ON author=cmt_auth
|
| |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 17:05)
| | Не понимаю. Запрос можно создать или не получится? | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 17:11)
| | >Не понимаю. Запрос можно создать или не получится?
Я написал. Безо всякой гарантии полезности. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 17:05)
| | Спасибо за sql, но он не работает! Объяснтие пожалуйста , что значит "Вообще ни одного чужого ключа, который бы опирался на первичные, не вижу" . Тоесть индексы не используются? И что такое cmt_cnt в запросе | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 17:19)
| | >Спасибо за sql, но он не работает!
Какой результат выдает?
>Объяснтие пожалуйста , что значит "Вообще ни одного чужого ключа, который бы опирался на первичные, не вижу" .
>Тоесть индексы не используются?
То есть таблицы связаны не связаны вообще, либо связаны не через первичные ключи.
У Вас в каждой таблице есть поле id - первичный ключ (уникальный номер записи) этой таблицы.
И ни в одной таблице нет ни одного поля такого же типа, которое указывало на поле id другой таблицы.
>И что такое cmt_cnt в запросе
cmt_cnt - псевдоним столбика внутреннего запроса с результатом подсчета числа коментариев по каждому автору коментария. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 17:58)
| | #1054 - Unknown column 'cmt_auth' in 'field list'
тип полей id и news_id изменил на int(11) . Таблицы news и comment в запросе связываются с помощью поля news_id | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 18:10)
| | Да... и вправду налажал.
SELECT c1.*, tc.cmt_cnt
FROM comments AS c1
JOIN (
SELECT COUNT(c2.id) AS cmt_cnt, author AS cmt_auth
FROM comments AS c2
GROUP BY c2.author
)
AS tc ON c1.author=tc.cmt_auth
|
| |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 18:30)
| | Спасибо за sql , но он выполняется слишком долго и ни так как хотелось бы.
Как я писал в первом посте, нужно вывести комментарии(если они есть) к новости с id=1810
а так же кол-во комментарий у авторов, оставившие комментарии к новости с id = 1810
Выводим новость
SELECT * FROM news WHERE news_id=1810
|
Выводим комментарии
SELECT comment.* FROM `comment` , news WHERE news.id ='1810' AND news.id = comment.news_id
|
Второй запрос выводит комменты к новости с id 1810 ,но нужно подсчитать кол-во комментариев у этих авторов....есть какие-нибудь варианты побыстрей. А по поводу связки таблиц мне не понятно, что тогда нужно сделать? Запросы быстро выполняются | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 20:16)
| | можно проще:
Выводим новость
SELECT * FROM news WHERE news_id=1810
| Выводим комментарии
SELECT * FROM comment WHERE news_id = 1810
|
Да. Я был неправ.
Вот видите же, в таблице comments есть чужой ключ к таблице news.
comment.news_id указывает на news.id
А к таблице users такого ключа нет. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 20:24)
| | Можно сравнить comment.author=users.login
Что у нас с подсчётом комментов,? | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 20:58)
| | >Можно сравнить comment.author=users.login
Можно, но будет долго, потому что ключ длинный , не опирается на первичный, и к тому же не проиндексированный.
>Что у нас с подсчётом комментов,?
С подсчетом комментов какого именно пользователя?
Или с подсчетом комментов к данной новости?
Не у нас, а у Вас. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 21:49)
| | Подсчёт всех комментов у пользователей(общее кол-во комментов у пользователей) , оставихших коммент в новости с id =1810
Да, у меня ) | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 22:30)
| |
SELECT COUNT(id) AS cnt FROM comment WHERE news_id = 8010
|
| |
|
|
|
|
|
|
|
для: Trianon
(26.07.2007 в 00:07)
| | Спасибо за помощь.
Запрос выводит общее кол-во комментарий к новости с id =$id
SELECT COUNT( id ) AS cnt
FROM COMMENT WHERE news_id =1810
|
Мне нужно чтобы рядом с комментарием автора отображалось общее кол-во его комментариев. | |
|
|
|
|
|
|
|
для: fiper
(26.07.2007 в 11:43)
| | Рядом с каким коментарием, если Вы выводите свойства конкретной новости?
SELECT c1.*, tc.cmt_cnt
FROM comments AS c1
JOIN (
SELECT COUNT(c2.id) AS cmt_cnt, author AS cmt_auth
FROM comments AS c2
GROUP BY c2.author
)
AS tc ON c1.author=tc.cmt_auth
WHERE c1.news_id = 8010
|
как минимум, пока Вы не переделаете структуру. | |
|
|
|
|
|
|
|
для: Trianon
(26.07.2007 в 11:44)
| | Огромное Спасибо.
Это sql то , что нужно, но выполняется 0.1229 сек | |
|
|
|
|
|
|
|
для: fiper
(26.07.2007 в 11:58)
| | Вы хотя бы индекс создайте на поле comment.author чтоли....
Да и на news_id не помешало бы. | |
|
|
|
|
|
|
|
для: Trianon
(26.07.2007 в 12:12)
| | Поставил индекс на comment.author , news_id уже был индексом ситуация не изменилась | |
|
|
|
|
|
|
|
для: fiper
(25.07.2007 в 16:58)
| | по каким полям в таблицах вы сопоставляете автора и его комментарии? (между news и comment) | |
|
|
|