|
|
|
| Доброе время суток!
Имеется следующее сообщение об ошибке:
"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());
}
?>
|
В чем ошибка?
Спасибо. | |
|
|
|
|
|
|
|
для: Deed
(14.11.2012 в 20:15)
| | Дело в том, что LEFT JOIN должен быть по синтаксису стоять до WHERE | |
|
|
|
|
|
|
|
для: Ильдар
(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());
?>
|
| |
|
|
|
|
|
|
|
для: Ильдар
(14.11.2012 в 21:19)
| | Спасибо. Но в этом случае "Column 'id' in order clause is ambiguous" - столбец 'id' является неопределенным. | |
|
|
|
|
|
|
|
для: Deed
(14.11.2012 в 21:56)
| | Столбец не неопределен, а неуникален. У вас в обоих таблицах есть по столбцу id и вы хотите чтобы мускул отсортировал по обоим сразу. | |
|
|
|
|
|
|
|
для: 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) инфе присоединить информацию о предыдущем количестве комментариев для каждой из вытянутой в ЭТОМ запросе новости для каждого пользователя отдельно. Чтобы разницу показывать как новые комментарии.
Я не знаю, как это реализовать. И прошу помощи.
Я изменил дублирующие названия столбцов и все получилось. Спасибо, Ильдар!
Как то громоздкая эта система... Может, кто реализовал подобную задачу иначе? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Sfinks
(15.11.2012 в 01:18)
| | верно говоришь | |
|
|
|