Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбрать данные из таблицы
 
 автор: fiper   (23.07.2007 в 03:01)   письмо автору
 
 

Есть база в ней несколько таблиц news,coments,users и т.д

Таблица comments содержит поля: id,news_id,author,comment

Помогите сделать один запрос который выведит комментарии к новости например с id =17 и кол-во комментарий у авторов комментов

   
 
 автор: cheops   (23.07.2007 в 11:04)   письмо автору
 
   для: fiper   (23.07.2007 в 03:01)
 

Можно воспользоваться следующим запросом
SELECT id,news_id,author,comment 
FROM comments
WHERE id =17

   
 
 автор: fiper   (23.07.2007 в 11:46)   письмо автору
 
   для: cheops   (23.07.2007 в 11:04)
 

Это понятно. а где кол-во комментарий у автора?

   
 
 автор: cheops   (23.07.2007 в 11:50)   письмо автору
 
   для: fiper   (23.07.2007 в 11:46)
 

Это лучше делать отдельным запросом - поле author что из себя представляет?

   
 
 автор: fiper   (23.07.2007 в 11:59)   письмо автору
 
   для: cheops   (23.07.2007 в 11:50)
 

Поле author varchar(255)


А отдельным запром наверно как то так

SELECT count( news_id ) 
FROM comment WHERE author='$author'


Лучше конечно одним запросом , так как вывод новости один select + вывод комментов + подсчёт комментов

   
 
 автор: Trianon   (23.07.2007 в 11:07)   письмо автору
 
   для: fiper   (23.07.2007 в 03:01)
 

нужно знать структуру таблиц.

   
 
 автор: fiper   (25.07.2007 в 16:58)   письмо автору
 
   для: 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;

   
 
 автор: Trianon   (25.07.2007 в 17:05)   письмо автору
 
   для: 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

   
 
 автор: fiper   (25.07.2007 в 17:11)   письмо автору
 
   для: Trianon   (25.07.2007 в 17:05)
 

Не понимаю. Запрос можно создать или не получится?

   
 
 автор: Trianon   (25.07.2007 в 17:13)   письмо автору
 
   для: fiper   (25.07.2007 в 17:11)
 

>Не понимаю. Запрос можно создать или не получится?
Я написал. Безо всякой гарантии полезности.

   
 
 автор: fiper   (25.07.2007 в 17:19)   письмо автору
 
   для: Trianon   (25.07.2007 в 17:05)
 

Спасибо за sql, но он не работает! Объяснтие пожалуйста , что значит "Вообще ни одного чужого ключа, который бы опирался на первичные, не вижу" . Тоесть индексы не используются? И что такое cmt_cnt в запросе

   
 
 автор: Trianon   (25.07.2007 в 17:58)   письмо автору
 
   для: fiper   (25.07.2007 в 17:19)
 

>Спасибо за sql, но он не работает!
Какой результат выдает?


>Объяснтие пожалуйста , что значит "Вообще ни одного чужого ключа, который бы опирался на первичные, не вижу" .
>Тоесть индексы не используются?

То есть таблицы связаны не связаны вообще, либо связаны не через первичные ключи.

У Вас в каждой таблице есть поле id - первичный ключ (уникальный номер записи) этой таблицы.
И ни в одной таблице нет ни одного поля такого же типа, которое указывало на поле id другой таблицы.



>И что такое cmt_cnt в запросе

cmt_cnt - псевдоним столбика внутреннего запроса с результатом подсчета числа коментариев по каждому автору коментария.

   
 
 автор: fiper   (25.07.2007 в 18:10)   письмо автору
 
   для: Trianon   (25.07.2007 в 17:58)
 

#1054 - Unknown column 'cmt_auth' in 'field list'

тип полей id и news_id изменил на int(11) . Таблицы news и comment в запросе связываются с помощью поля news_id

   
 
 автор: Trianon   (25.07.2007 в 18:30)   письмо автору
 
   для: 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

   
 
 автор: fiper   (25.07.2007 в 20:16)   письмо автору
 
   для: 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 ,но нужно подсчитать кол-во комментариев у этих авторов....есть какие-нибудь варианты побыстрей. А по поводу связки таблиц мне не понятно, что тогда нужно сделать? Запросы быстро выполняются

   
 
 автор: Trianon   (25.07.2007 в 20:24)   письмо автору
 
   для: 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 такого ключа нет.

   
 
 автор: fiper   (25.07.2007 в 20:58)   письмо автору
 
   для: Trianon   (25.07.2007 в 20:24)
 

Можно сравнить comment.author=users.login

Что у нас с подсчётом комментов,?

   
 
 автор: Trianon   (25.07.2007 в 21:49)   письмо автору
 
   для: fiper   (25.07.2007 в 20:58)
 

>Можно сравнить comment.author=users.login

Можно, но будет долго, потому что ключ длинный , не опирается на первичный, и к тому же не проиндексированный.

>Что у нас с подсчётом комментов,?

С подсчетом комментов какого именно пользователя?
Или с подсчетом комментов к данной новости?

Не у нас, а у Вас.

   
 
 автор: fiper   (25.07.2007 в 22:30)   письмо автору
 
   для: Trianon   (25.07.2007 в 21:49)
 

Подсчёт всех комментов у пользователей(общее кол-во комментов у пользователей) , оставихших коммент в новости с id =1810


Да, у меня )

   
 
 автор: Trianon   (26.07.2007 в 00:07)   письмо автору
 
   для: fiper   (25.07.2007 в 22:30)
 


SELECT COUNT(id) AS cnt FROM comment WHERE news_id = 8010

   
 
 автор: fiper   (26.07.2007 в 11:43)   письмо автору
 
   для: Trianon   (26.07.2007 в 00:07)
 

Спасибо за помощь.

Запрос выводит общее кол-во комментарий к новости с id =$id

SELECT COUNT( id ) AS cnt
FROM COMMENT WHERE news_id =1810



Мне нужно чтобы рядом с комментарием автора отображалось общее кол-во его комментариев.

   
 
 автор: Trianon   (26.07.2007 в 11:44)   письмо автору
 
   для: 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


как минимум, пока Вы не переделаете структуру.

   
 
 автор: fiper   (26.07.2007 в 11:58)   письмо автору
 
   для: Trianon   (26.07.2007 в 11:44)
 

Огромное Спасибо.
Это sql то , что нужно, но выполняется 0.1229 сек

   
 
 автор: Trianon   (26.07.2007 в 12:12)   письмо автору
 
   для: fiper   (26.07.2007 в 11:58)
 

Вы хотя бы индекс создайте на поле comment.author чтоли....
Да и на news_id не помешало бы.

   
 
 автор: fiper   (26.07.2007 в 12:19)   письмо автору
 
   для: Trianon   (26.07.2007 в 12:12)
 

Поставил индекс на comment.author , news_id уже был индексом ситуация не изменилась

   
 
 автор: marcus   (25.07.2007 в 18:21)   письмо автору
 
   для: fiper   (25.07.2007 в 16:58)
 

по каким полям в таблицах вы сопоставляете автора и его комментарии? (между news и comment)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования