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

Форум MySQL

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

 

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

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

тема: Вложенные запросы sql
 
 автор: kapitalist   (06.09.2012 в 09:37)   письмо автору
 
 

Всем привет. Пытаюсь понять вложенные запросы.
Пишу код:
<?php
require_once 'db.php';
 
$sql "SELECT title,image,url FROM page WHERE url IN
(SELECT login FROM comment)"
;
 
$query mysql_query($sql);
 
while(
$row mysql_fetch_assoc($query))
{
 
    
$data[$row[id]] = $row
}
 
echo 
"<pre>";
print_r($data);
echo 
"</pre>";
?>

Но я хотел бы помимо логина, вытащить еще другие поля из таблицы comment. Как это сделать?

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 09:37)   письмо автору
 
   для: kapitalist   (06.09.2012 в 09:37)
 

Сделал такой запрос:
$sql = "SELECT * FROM page,comment WHERE page.type='user'";

Получается что инфу он собирает, но только пользователи у меня разные. А он инфу о первом из них вытаскивает!
Как сделать, чтобы к каждому комменту скрипт вытаскивал инфу о пользователе который оставил коммент?

  Ответить  
 
 автор: cheops   (06.09.2012 в 11:45)   письмо автору
 
   для: kapitalist   (06.09.2012 в 09:37)
 

Вы хотите из вложенного запроса передать информацию в основной? Так не получится, в случае вложенных запросов возможна передача информации только из основного запроса во вложенный - это так называемые коррелированные запросы. Если у вас первый случай, вам лучше воспользоваться многотабличным SELECT-запросом.

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 13:21)   письмо автору
 
   для: cheops   (06.09.2012 в 11:45)
 

Мне нужно вытащить комментарий и инфу о пользователе, который его оставил.
На одном форуме мне сказали воспользоваться join.
Вот получился такой код:

$sql = "SELECT  comment.text, comment.parent_id, comment.date, page.url, page.title, page.image
     FROM  comment LEFT JOIN page
     ON  comment.login=page.url";


Но я не могу понять как мне вывести несколько записей. Так как на том форуме, сказали что цикл отправит сервер в далекое странствие.

  Ответить  
 
 автор: cheops   (06.09.2012 в 13:48)   письмо автору
 
   для: kapitalist   (06.09.2012 в 13:21)
 

Сейчас выводится только одна строка? Если не сложно прикрепите короткий дамп, чтобы можно было воспроизвести ситуацию на сервере и по экспериментировать.

  Ответить  
 
 автор: Lotanaen   (06.09.2012 в 14:01)   письмо автору
 
   для: kapitalist   (06.09.2012 в 13:21)
 

запрос выполните в phpmyadmin - сколько записей выводит? может у вас проблема с выводом на страницу, а не с выборкой из базы?

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 15:36)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 14:01)
 

Ну я тоже думаю, что проблема с выводом на страницу.
В phpmyadmin выводит 5 записей.

В пхп файле я пишу такой код:

$query = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_assoc($query))
{
    $data[$row[id]] = $row; 
}
echo "<pre>";
print_r($data);
echo "</pre>"; 

  Ответить  
 
 автор: Lotanaen   (06.09.2012 в 15:41)   письмо автору
 
   для: kapitalist   (06.09.2012 в 15:36)
 

А разве у Вас есть поле `id`? в запросе Вы его не выбираете...
Наверное нужно : $data[] = $row; ?

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 15:54)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 15:41)
 

Не помогло!
Вот весь код, слегка измененный.
<?php
require_once 'db.php';

$sql "SELECT  comment.id, comment.name, comment.url, comment.date, comment.text, comment.parent_id, comment.date, page.url, page.title, page.image
     FROM  comment LEFT JOIN page
     ON  comment.login=page.url WHERE comment.id='50'"
;

$query mysql_query($sql) or die(mysql_error());
while(
$row mysql_fetch_assoc($query))
{
$data[] = $row;
}
echo 
"<pre>";
print_r($data);
echo 
"</pre>"

?>

  Ответить  
 
 автор: Lotanaen   (06.09.2012 в 16:06)   письмо автору
 
   для: kapitalist   (06.09.2012 в 15:54)
 

так comment.id это у вас автоинкримент в таблице комментов? тогда и будет возвращать только одну строку. Вы что желаете получить? наверное нужно : WHERE comment.id='50' OR comment.parent_id=50 ? для более точного ответа хотя бы структуру таблиц выложите и поясните связки внутри таблиц и между таблицами... ну и LEFT JOIN пожалуй тут Вам не нужен или у Вас есть комменты без привязки к таблице пользователей?

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 16:18)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 16:06)
 

Это таблица комментариев:

CREATE TABLE IF NOT EXISTS `comment` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `login` varchar(50) NOT NULL,
  `text` text NOT NULL,
  `url` int(9) NOT NULL,
  `date` datetime NOT NULL,
  `parent_id` int(9) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=59 ;

А это с юзерами:
CREATE TABLE IF NOT EXISTS `page` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `text` text NOT NULL,
  `url` varchar(50) NOT NULL,
  `type` varchar(50) NOT NULL,
  `image` varchar(255) NOT NULL,
  `photo` text NOT NULL,
  `animal` varchar(255) NOT NULL,
  `banner` varchar(255) NOT NULL,
  `link` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `status` varchar(255) NOT NULL,
  `sait` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `region` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=28 ;

  Ответить  
 
 автор: Lotanaen   (06.09.2012 в 16:33)   письмо автору
 
   для: kapitalist   (06.09.2012 в 16:18)
 


$sql = "SELECT  comment.id, comment.name, comment.url, comment.date, comment.text, comment.parent_id, comment.date, page.url, page.title, page.image
     FROM  comment, page
     WHERE  comment.login=page.url and comment.id='50' OR comment.parent_id=50";

а такой запрос попробуйте - должен сработать

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 16:41)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 16:33)
 

Сработало! Спасибо. Сделал только вот так:
$sql = "SELECT  comment.id, comment.name, comment.url, comment.date, comment.text, comment.parent_id, comment.date, page.url, page.title, page.image 
     FROM  comment, page 
     WHERE  comment.login=page.url";

  Ответить  
 
 автор: Lotanaen   (06.09.2012 в 16:43)   письмо автору
 
   для: kapitalist   (06.09.2012 в 16:41)
 

да, это если все комменты нужно вывести - там я в скобки забыл взять AND ( .... OR ...)

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 17:20)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 16:43)
 

Ну мне потом нужно будет для каждой страницы свои комменты вывести, но я думаю это не сложно :)

  Ответить  
 
 автор: kapitalist   (06.09.2012 в 15:55)   письмо автору
 
   для: Lotanaen   (06.09.2012 в 15:41)
 

Вот результат:
Array
(
[0] => Array
(
[id] => 50
[name] =>
[url] => kapitalist
[date] => 2012-09-05 21:09:48
[text] => 123
[parent_id] => 0
[title] => Виталий
[image] => me.jpg
)

)

  Ответить  
Rambler's Top100
вверх

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