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

Форум MySQL

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

 

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

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

тема: LEFT JOIN
 
 автор: Deed   (14.11.2012 в 20:15)   письмо автору
 
 

Доброе время суток!
Имеется следующее сообщение об ошибке:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN `views` ON posts.id=views.nid AND views.uid=12' at line 1"

А суть такая.
Имеются две таблицы. Первая posts - данные о постах пользователей, вторая views содержит поля: id, uid - айди пользователя из таблицы пользователей, nid - айди поста из таблицы постов и тд.) В таб. views заносятся данные id пользователя, открывшего какую-либо новость, id этой новости, количество комментариев к новости и таймстамп захода этого юзера на эту новость. (Это мне больше ничего лучшего в голову не пришло, чтобы показать пользователю наличие новых комментов).

<?php
if($_COOKIE['polit']==1){
    
$wpolit="`polit`=0";
    
$wwhere[].=$wpolit;
}
if(
$_COOKIE['rating']==1){
    
$wrating="`range`>149";
    
$wwhere[].=$wrating;
}
if(
$_COOKIE['old_new']==1){
    
$woldnew="NOT `time`<".$_SESSION['time_razn'];
    
$wwhere[].=$woldnew;
}
if(
count($wwhere)>0&&count($wwhere)<4){
    
$cw=count($wwhere);
    
$where_w_p=" WHERE ".$wwhere[0];
    for(
$i=1;$i<$cw;$i++){
        
$where_w_p.=" AND ".$wwhere[$i];
    }
}

//!For pagination
$per_page=39//number posts of one page
$num_pages=ceil($total_posts/$per_page); //total number of pages
if($num_pages>1&&is_numeric($_GET['page'])){
    
$start=abs(($_GET['page']-1)*$per_page);
}
else{
    
$start=0;
}

//Выводим лимитированное количество новостей
if(empty($_SESSION['uid'])){// Если зашел незарегистрированный пользователь ($_SESSION['uid'] - содержит id пользователя из таблицы пользователей)
    
$alls=mysql_query("SELECT * 
FROM `posts`"
.$where_w_p.
ORDER BY `id` DESC 
LIMIT "
.$start.",".$per_page,$bd)
or die(
mysql_error());
}
else{
    
$alls=mysql_query("SELECT * FROM `posts`".
$where_w_p.
ORDER BY `id`DESC
LIMIT "
.$start.",".$per_page."
LEFT JOIN `views` 
ON posts.id=views.nid AND
views.uid="
.$_SESSION['uid'],$bd)
or die(
mysql_error());
}

?>

В чем ошибка?
Спасибо.

  Ответить  
 
 автор: Ильдар   (14.11.2012 в 21:16)   письмо автору
 
   для: Deed   (14.11.2012 в 20:15)
 

Дело в том, что LEFT JOIN должен быть по синтаксису стоять до WHERE

  Ответить  
 
 автор: Ильдар   (14.11.2012 в 21:19)   письмо автору
 
   для: Ильдар   (14.11.2012 в 21:16)
 

т.е. должно быть вот так
<?php
$alls
=mysql_query("SELECT * FROM `posts` LEFT JOIN `views` ON posts.id=views.nid AND views.uid = ".$_SESSION['uid']." ".$where_w_p."  ORDER BY `id`DESC LIMIT ".$start.",".$per_page ,$bd) or die(mysql_error());
?>

  Ответить  
 
 автор: Deed   (14.11.2012 в 21:56)   письмо автору
 
   для: Ильдар   (14.11.2012 в 21:19)
 

Спасибо. Но в этом случае "Column 'id' in order clause is ambiguous" - столбец 'id' является неопределенным.

  Ответить  
 
 автор: Sfinks   (15.11.2012 в 00:06)   письмо автору
 
   для: Deed   (14.11.2012 в 21:56)
 

Столбец не неопределен, а неуникален. У вас в обоих таблицах есть по столбцу id и вы хотите чтобы мускул отсортировал по обоим сразу.

  Ответить  
 
 автор: Deed   (15.11.2012 в 00:45)   письмо автору
 
   для: Sfinks   (15.11.2012 в 00:06)
 

Имеются две таблицы:
posts и views, в первой - посты юзеров, вторая содержит информацию о количестве комментариев к посту во время последнего просмотра поста пользователем.
$all_post=mysql_query("SELECT * FROM `posts` WHERE `politic`='1' AND `rating`>150 ORDER BY `id` DESC LIMIT 40, 20",$db);
Здесь проблем нет.
Теперь мне нужно, чтобы из таблицы views вытянулась информация о количестве комментариев в ОТОБРАННЫХ в первом запросе постах для данного юзера.
posts:
| id | author | politic | rating | text | num_comms | etc...
Здесь num_comms - общее количество комментариев к конкретному посту.
Когда конкретный юзер открывает этот пост, в таблицу views вносится инфа:
| id | uid - (айди этого юзера) | nid - (айди этой новости) | num_comms - (количество комментариев к этой новости в этот конкретный момент времени) | time - (time()) |
Теперь я хотел бы, чтобы к вытянутой в первом запросе ($all_post) инфе присоединить информацию о предыдущем количестве комментариев для каждой из вытянутой в ЭТОМ запросе новости для каждого пользователя отдельно. Чтобы разницу показывать как новые комментарии.
Я не знаю, как это реализовать. И прошу помощи.

Я изменил дублирующие названия столбцов и все получилось. Спасибо, Ильдар!
Как то громоздкая эта система... Может, кто реализовал подобную задачу иначе?

  Ответить  
 
 автор: Sfinks   (15.11.2012 в 01:18)   письмо автору
 
   для: Deed   (15.11.2012 в 00:45)
 

Я пока ниче не понял....

Давайте, исходя из предположения, что
- логика вашего ошибочного запроса правильная, а
- запрос Ильдар'a от 14.11.2012 21:19 почти правильный
я просто расшифрую свой предыдущий пост....

Вы соединяете две таблицы: `posts` LEFT JOIN `views`
И хотите их отсортировать: ORDER BY
По убыванию, по полю id: id DESC

Но поле id есть как в posts, так и во views. Так?
Вот мускул и не может понять по какому из них сортировать, и говорит вам: "Column 'id' in order clause is ambiguous"

Вывод: Уточните
ORDER BY posts.id DESC
или
ORDER BY views.id DESC

  Ответить  
 
 автор: Ильдар   (18.11.2012 в 01:49)   письмо автору
 
   для: Sfinks   (15.11.2012 в 01:18)
 

верно говоришь

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

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