|
|
|
| Доброго времени суток!
Имеются две таблицы:
1)mailing (письма):
|id|time|num_comms(кол-во комментов)|cor(автор письма)|
resp(получатели, может быть несколько, через запятую)|text|send|
|
Запрос:
$user_mail_all=mysql_query("SELECT * FROM `mailing`
WHERE MATCH (resp) AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username'
ORDER BY `id` DESC
LIMIT ".$start.",".$per_page )
|
работает замечательно. (Здесь $user_resp=str_replace("-","tyre",$username) то есть убиреам возможное тире в имени пользователя для корректной работы поиска MATCH (resp) AGAINST(...), resp, разумеется, fooltext).
2)mail_views (запись количества комментариев к СВОИМ письмам, прочитанных юзером):
|id|uid(ай-ди юзера)|lid(ай-ди письма)|time
|number(количество комментов к этому письму на момент открытия его юзером)|
|
Эта таблица нужна для вывода количества ответов на каждое письмо, оставленное после закрытия его адресатом или автором. Для показа новых ответов.
И вот, такой запрос:
$user_mail_all=mysql_query("SELECT * FROM `mailing`
WHERE MATCH (resp) AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username' LEFT JOIN `mail_views`
ON mailing.id=mail_views.lid
AND mail_views.uid=".$_SESSION['uid']."
ORDER BY `id` DESC
LIMIT ".$start.",".$per_page)
|
выдает такую ошибку:
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 `mail_views` ON mailing.id=mail_views.lid AND mail_views.uid=12 ORDER ' at line 1
(Здесь 12 - это id пользователя, переданный в $_SESSION['uid'])
Если убрать из запроса "MATCH (resp) AGAINST ('$user_resp' IN BOOLEAN MODE) OR ", оставив
$user_mail_all=mysql_query("SELECT * FROM `mailing`
WHERE `cor`='$username' LEFT JOIN `mail_views` ON mailing.id=mail_views.lid
AND mail_views.uid=".$_SESSION['uid']."
ORDER BY `id` DESC
LIMIT ".$start.",".$per_page)
|
ошибка сохраняется.
Подскажите, пожалуйста, в чем дело?
Спасибо. | |
|
|
|
|
|
|
|
для: Deed
(12.01.2013 в 20:33)
| | для начала resp(получатели, может быть несколько, через запятую)
сильно настораживает
С этим полем нельзя сделать ничего вразумительного кроме выборки целиком, да и то не по нему самому, а по другим полям строки.
у вас же идет по нему полнотекстовый поиск, и что что все это работает замечательно, вам только кажется.
второй запрос у вас просто неправильно составлен с точки зрения синтаксиса (оба варианта), о чем на вас и ругается СУРБД
грубо говоря, WHERE `cor`='$username' LEFT JOIN так не бывает | |
|
|
|
|
|
|
|
|
для: Deed
(12.01.2013 в 22:08)
| | И все-таки проблема...
Вот такая вот получилась конструкция:
<?php
$user_mail_all=mysql_query("SELECT *
FROM `mailing`
LEFT JOIN `mail_views`
ON mailing.id=mail_views.lid
WHERE MATCH (resp)
AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username'
AND mail_views.uid=".$_SESSION['uid']."
ORDER BY `id`DESC LIMIT ".$start.",".$per_page) or die(mysql_error());
?>
|
В таблице `mailing` находятся письма, и пользователь может быть либо с столбце `cor` (если он - отправитель), либо в столбце `resp` (получатель, их может быть несколько, через запятую, где '$user_resp' - это наш '$username' с экранированным тире(если оно есть в имени пользователя)).
В таблице `mail_views` хранятся записи о количестве ответов на письма, для того, чтобы подсвечивать новые.
Суть проблемы.
В этой редакции запроса, в которой идет поиск сначала получателей в столбце `resp`, письма получателям видны, они выводятся. Но отправитель (столбец `cor`) их не видит.
Если же очередность условий запроса поменять местами, то есть, вместо:
WHERE MATCH (resp)
AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username'
|
написать:
WHERE `cor`='$username'
OR MATCH (resp)
AGAINST ('$user_resp' IN BOOLEAN MODE)
|
выводятся только письма у отправителя, а уже получатели ничего на странице не видят.
Почему?? | |
|
|
|
|
|
|
|
для: Deed
(13.01.2013 в 22:52)
| | `resp` (получатель, их может быть несколько, через запятую)
у вас нарушен первый закон нормализации, это означает неправильную организацию БД
ферштейн? | |
|
|
|
|
|
|
|
для: Valick
(13.01.2013 в 23:08)
| | Найн.
`resp`, само собой, fulltext, если что.
И если сотавить:
<?php
$user_mail_all=mysql_query("SELECT *
FROM `mailing`
LEFT JOIN `mail_views`
ON mailing.id=mail_views.lid
WHERE MATCH (resp)
AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username'
ORDER BY `mailing`.`id` DESC LIMIT ".$start.",".$per_page) or die(mysql_error());
?>
|
Все отображается, НО:
<?php
$nnn=mysql_num_rows($user_mail_all);
echo($nnn); //2 при одной всего записи в таблице.
?>
|
| |
|
|
|
|
|
|
|
для: Deed
(14.01.2013 в 00:22)
| | Проблема, кажись, решена:
<?php
$user_mail_all=mysql_query("SELECT *
FROM `mailing`
LEFT JOIN `mail_views`
ON mailing.id=mail_views.vid
WHERE MATCH (resp)
AGAINST ('$user_resp' IN BOOLEAN MODE)
OR `cor`='$username'
ORDER BY `mailing`.`time` DESC LIMIT ".$start.",".$per_page)
?>
|
Сделано почти наугад заменой
ON mailing.id=mail_views.lid
|
(где `mail_views`.`lid` - это ай-ди номер прочтенного текущим пользователем письма в таблице `mailing`, записанный в табл. `mail_views`)
на:
ON mailing.id=mail_views.vid
|
(здесь `mail_views`.`vid` - это PRIMARY KEY табл. `mail_views`)
Наугад, потому, что я плохо представляю себе, что такое и что делает оператор ON в LEFT JOIN. | |
|
|
|