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...
Тебе же показали соединить внутри 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 написал(а):
Словесно сложно обьяснить, каша получается. В общем вот истории переписок:

Допустим, что пользователь А отправил сообщение пользователю Б, но в диалогах у пользователя А не отображается пользователь Б, посколько выборка идёт только из тех сообщений, где пользователь А является получателем а мне нужно чтобы группировались и по тем, и по другим. Проще говоря, нужно отобразить людей от которых пользователь не только получил сообщения, но и кому отправил.
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
Или внутри:
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 ( |
Я написал условие в WHILE, всем спасибо и +1 репутации от меня
Теперь вот столкнулся с проблемой вывода количества сгруппированных GROUP BY записей, но это уже в отдельную тему.