[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Дополнительный параметр запроса IN
xxxLOGIATxxx
Мы запрашиваем данные из двух таблиц и соединяем их параметром JOIN. У нас они соединяются по такому параметру:

ON MESSAGES.message_authoruser_id = USERS.user_id


Но мне нужно соединить их сразу по двум параметрам, тоесть, значения из таблицы пользователей также должны быть привязаны ко второму параметру:

ON MESSAGES.message_owneruser_id = USERS.user_id


Есть-ли возможность совместить их в один запрос или нужно строить второй и потом соединить их средствами PHP?

Чтобы было проще понять, я поясню свою цель. На сайте используется система личных сообщений и сейчас я на этапе создания диалогов (истории переписок). Нужно вывести данные пользователей с которыми контактировал пользователь, тоесть, не только от кого получал сообщения пользователь, но и кому отправлял. Помогите советом куда копать надо, уже неделю парюсь.

Вот весь запрос:

    $sql = "
SELECT MESSAGES.*, USERS.*
FROM se_messages MESSAGES
JOIN se_users USERS
ON MESSAGES.message_authoruser_id = USERS.user_id
WHERE message_owneruser_id = {$user->user_info['user_username']}
OR message_authoruser_id = {$user->user_info['user_username']}
GROUP BY MESSAGES.message_authoruser_id
ORDER BY MESSAGES.message_id DESC"
;




Спустя 3 часа, 20 минут, 1 секунда (2.11.2011 - 07:45) linker написал(а):
ON MESSAGES.message_authoruser_id = USERS.user_id AND MESSAGES.message_owneruser_id = USERS.user_id

Спустя 1 день, 19 часов, 29 минут, 52 секунды (4.11.2011 - 03:15) xxxLOGIATxxx написал(а):
Цитата (linker @ 2.11.2011 - 04:45)
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">ON</span> MESSAGES<span class="sh_symbol">.</span>message_authoruser_id <span class="sh_symbol">=</span> USERS<span class="sh_symbol">.</span>user_id <span class="sh_keyword">AND</span> MESSAGES<span class="sh_symbol">.</span>message_owneruser_id <span class="sh_symbol">=</span> USERS<span class="sh_symbol">.</span>user_id</pre>


Спасибо, но не помогло. Данные вообще не выводятся.

Всё происходит в созданной функции и полный код выглядит так:

  function user_dialogue_list()
{
global $database, $user;

$dialogues = NULL;


$sql = "
SELECT MESSAGES.*, USERS.*
FROM se_messages MESSAGES
JOIN se_users USERS
ON MESSAGES.message_authoruser_id = USERS.user_id
WHERE message_owneruser_id = {
$user->user_info['user_username']}
OR message_authoruser_id = {
$user->user_info['user_username']}
GROUP BY MESSAGES.message_authoruser_id
ORDER BY MESSAGES.message_id DESC"
;

$resource = $database->database_query($sql);

$dialogues = array();
while( $user_info = $database->database_fetch_assoc($resource) )
{
$dialogue_user = new SEUser();
$dialogue_user->user_info['user_id'] = $user_info['user_id'];
$dialogue_user->user_info['user_username'] = $user_info['user_username'];
$dialogue_user->user_info['user_photo'] = $user_info['user_photo'];
$dialogue_user->user_info['user_fname'] = $user_info['user_fname'];
$dialogue_user->user_info['user_lname'] = $user_info['user_lname'];
$dialogue_user->user_displayname();
$dialogues[] =& $dialogue_user;
unset($dialogue_user);
}
// RETURN ARRAY
return $dialogues;

}

Спустя 11 минут, 13 секунд (4.11.2011 - 03:26) imbalance_hero написал(а):
xxxLOGIATxxx
Тебе же показали соединить внутри JOIN ON, а не в WHERE...

Спустя 8 минут (4.11.2011 - 03:34) xxxLOGIATxxx написал(а):
Цитата (imbalance_hero @ 4.11.2011 - 00:26)
xxxLOGIATxxx
Тебе же показали соединить внутри JOIN ON, а не в WHERE...

Я так и делал, вообще ничего не отобразилось:

    $sql = "
SELECT MESSAGES.*, USERS.*
FROM se_messages MESSAGES
JOIN se_users USERS
ON MESSAGES.message_authoruser_id = USERS.user_id AND MESSAGES.message_owneruser_id = USERS.user_id
WHERE message_owneruser_id = {
$user->user_info['user_username']}
OR message_authoruser_id = {
$user->user_info['user_username']}
GROUP BY MESSAGES.message_authoruser_id
ORDER BY MESSAGES.message_id DESC"
;



А для WHERE это уже другое, там собирается инфа только о тех сообщениях, в которых пользователь являлся автором или получателем.





Спустя 7 минут, 48 секунд xxxLOGIATxxx написал(а):
Собсно, нужно построить запрос который отобразит тех людей с которыми контактировал пользователь и отобразиться они должны по одному разу. У меня получается так, что отображаются только пользователи которые сами прислали как минимум одно сообщение, а если же ты сам им написал сообщение и не получил от них ни одного, то пользователь не отображается, исходящие не учитываются, а должны.



Спустя 26 минут, 13 секунд xxxLOGIATxxx написал(а):
Словесно сложно обьяснить, каша получается. В общем вот истории переписок:

user posted image

Допустим, что пользователь А отправил сообщение пользователю Б, но в диалогах у пользователя А не отображается пользователь Б, посколько выборка идёт только из тех сообщений, где пользователь А является получателем а мне нужно чтобы группировались и по тем, и по другим. Проще говоря, нужно отобразить людей от которых пользователь не только получил сообщения, но и кому отправил.

GROUP BY MESSAGES.message_authoruser_id AND  MESSAGES.message_owneruser_id
/// судя по тому что ничего не отображается - не катит.



Может надо строить второй запрос?



Спустя 37 минут, 21 секунда xxxLOGIATxxx написал(а):
А без GROUP BY этот код работает, отображаются все сообщения в которых пользователь выступал в качестве автора или получателя:

Цитата
ON MESSAGES.message_authoruser_id = USERS.user_id AND MESSAGES.message_owneruser_id = USERS.user_id


Теперь не знаю как вывести по одному результату без повторов. GROUP BY то уже нет.

    $sql = "
SELECT MESSAGES.*, USERS.*
FROM se_messages MESSAGES
JOIN se_users USERS
ON MESSAGES.message_authoruser_id = USERS.user_id OR MESSAGES.message_owneruser_id = USERS.user_id
WHERE message_owneruser_id = {
$user->user_info['user_username']}
OR message_authoruser_id = {
$user->user_info['user_username']}
ORDER BY MESSAGES.message_id DESC"
;




Спустя 1 час, 38 минут, 54 секунды xxxLOGIATxxx написал(а):
Таааакз, почти закончил (слава те, хоспади):

    $sql = "
SELECT MESSAGES.*, USERS.*
FROM se_messages MESSAGES
JOIN se_users USERS
ON MESSAGES.message_authoruser_id = USERS.user_id
OR MESSAGES.message_owneruser_id = USERS.user_id
WHERE message_owneruser_id = {
$user->user_info['user_username']}
OR message_authoruser_id = {
$user->user_info['user_username']}
GROUP BY USERS.user_id
ORDER BY MESSAGES.message_id DESC"
;


Осталось избавиться от переписки с самим-собой :D

Спустя 3 часа, 36 минут, 37 секунд (4.11.2011 - 07:10) imbalance_hero написал(а):
Ну так напиши условие:
AND message_owneruser_id <> message_authoruser_id

Или внутри:
WHERE (
message_owneruser_id = {$user->user_info['user_username']}
AND
message_authoruser_id <> {$user->user_info['user_username']}
)
OR (
message_owneruser_id <> {$user->user_info['user_username']}
AND
message_authoruser_id = {$user->user_info['user_username']}
)

Спустя 23 часа, 25 минут, 59 секунд (5.11.2011 - 06:36) xxxLOGIATxxx написал(а):
Цитата (imbalance_hero @ 4.11.2011 - 04:10)
Ну так напиши условие:
AND message_owneruser_id <> message_authoruser_id

Или внутри:
WHERE (
message_owneruser_id = {$user->user_info['user_username']}
AND
message_authoruser_id <> {$user->user_info['user_username']}
)
OR (
message_owneruser_id <> {$user->user_info['user_username']}
AND
message_authoruser_id = {$user->user_info['user_username']}
)

Я написал условие в WHILE, всем спасибо и +1 репутации от меня

Теперь вот столкнулся с проблемой вывода количества сгруппированных GROUP BY записей, но это уже в отдельную тему.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.