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

Форум MySQL

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

 

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

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

тема: WHERE MATCH () AGAINST ( IN BOOLEAN MODE) и LEFT JOIN в одном запросе
 
 автор: Deed   (12.01.2013 в 20:33)   письмо автору
 
 

Доброго времени суток!
Имеются две таблицы:
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)


ошибка сохраняется.

Подскажите, пожалуйста, в чем дело?
Спасибо.

  Ответить  
 
 автор: Valick   (12.01.2013 в 21:20)   письмо автору
 
   для: Deed   (12.01.2013 в 20:33)
 

для начала resp(получатели, может быть несколько, через запятую)
сильно настораживает
С этим полем нельзя сделать ничего вразумительного кроме выборки целиком, да и то не по нему самому, а по другим полям строки.
у вас же идет по нему полнотекстовый поиск, и что что все это работает замечательно, вам только кажется.
второй запрос у вас просто неправильно составлен с точки зрения синтаксиса (оба варианта), о чем на вас и ругается СУРБД
грубо говоря, WHERE `cor`='$username' LEFT JOIN так не бывает

  Ответить  
 
 автор: Deed   (12.01.2013 в 22:08)   письмо автору
 
   для: Valick   (12.01.2013 в 21:20)
 

Совершенно верно!!
Вот здесь мне разжевали! http://stackoverflow.com/questions/14296021/left-join-not-works-after-match-against-in-boolean-mode

Спасибо!!

  Ответить  
 
 автор: Deed   (13.01.2013 в 22:52)   письмо автору
 
   для: 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) 


выводятся только письма у отправителя, а уже получатели ничего на странице не видят.
Почему??

  Ответить  
 
 автор: Valick   (13.01.2013 в 23:08)   письмо автору
 
   для: Deed   (13.01.2013 в 22:52)
 

`resp` (получатель, их может быть несколько, через запятую)
у вас нарушен первый закон нормализации, это означает неправильную организацию БД
ферштейн?

  Ответить  
 
 автор: Deed   (14.01.2013 в 00:22)   письмо автору
 
   для: 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 в 01:10)   письмо автору
 
   для: 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.

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

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