Я делаю приложение для знакомств, похожее на tindler, где пользователи могут любить или не любить друг друга. Если оба пользователя одинаково похожи друг на друга, они должны иметь возможность общаться друг с другом. Я придумал следующий запрос, чтобы обработать вытягивание списка пользователей, с которыми вы можете общаться в чате/с часами - проблема, с которой я сталкиваюсь, - это только желание вытащить последнее сообщение чата, только чтобы показать небольшую рекламу перед вами нажмите на сам чат. Мой запрос работает, но он возвращает самую старую запись (самый низкий ID) чата, а не самую новую. Заказ, по-видимому, не влияет на возвращение правильного результата.codeigniter присоединиться только к последней строке
$data = $this->db->select('users.id,display_name,city,state,gender,users_pictures.picture,users_chats.message')
->join('users_pictures','users_pictures.user_id=users.id')
->join('users_chats','users_chats.user_id=users.id OR users_chats.foreign_user_id=users.id','left outer')
->where('EXISTS (SELECT 1 FROM users_likes_dislikes ld WHERE (ld.foreign_user_id = '.$this->user_id.' AND ld.user_id=users.id AND ld.event_type=1) OR (SELECT 1 FROM users_likes_dislikes ld WHERE ld.foreign_user_id = users.id AND ld.user_id='.$this->user_id.' AND ld.event_type=1))', '', FALSE)
->where('NOT EXISTS (SELECT 1 FROM users_blocks ub WHERE (ub.foreign_user_id = users.id AND ub.user_id='.$this->user_id.') OR (SELECT 1 FROM users_blocks ub WHERE ub.foreign_user_id = '.$this->user_id.' AND ub.user_id=users.id))', '', FALSE)
->where('((users_chats.user_id='.$this->user_id.' OR users_chats.foreign_user_id='.$this->user_id.') OR (users_chats.user_id is NULL AND users_chats.foreign_user_id is NULL))')
->order_by('users_chats.id','DESC')
->group_by('users.id')
->get('users')
->result_array();
Вот текущая таблица MySQL для users_chats:
id user_id foreign_user_id message created
1 1 4 test 2013-05-22 15:42:44
2 1 4 test2 2013-05-22 15:44:38
Я принял order_by бы гарантировать, что сообщение test2 является то, что отображается.
Вот пример вывода:
Array ([0] => Array ([id] => 4 [display_name] => testinguser [city] => west hills [state] => ca [gender] => 2 [picture] => testasdfasdf.jpg [message] => test))
Любая помощь очень ценится :)
редактировать - сам запрос (без группы по, это работает, но мне нужно его группе в user.id так что я не иметь несколько записей для одного пользователя в массиве):
SELECT
`users`.`id`,
`display_name`,
`city`,
`state`,
`gender`,
`users_pictures`.`picture`,
`users_chats`.`message`
FROM (`users`)
JOIN `users_pictures`
ON `users_pictures`.`user_id` = `users`.`id`
JOIN `users_chats`
ON `users_chats`.`user_id` = `users`.`id`
OR users_chats.foreign_user_id = users.id
WHERE EXISTS(SELECT
1
FROM users_likes_dislikes ld
WHERE (ld.foreign_user_id = 1
AND ld.user_id = users.id
AND ld.event_type = 1)
OR (SELECT
1
FROM users_likes_dislikes ld
WHERE ld.foreign_user_id = users.id
AND ld.user_id = 1
AND ld.event_type = 1))
AND NOT EXISTS(SELECT
1
FROM users_blocks ub
WHERE (ub.foreign_user_id = users.id
AND ub.user_id = 1)
OR (SELECT
1
FROM users_blocks ub
WHERE ub.foreign_user_id = 1
AND ub.user_id = users.id))
AND ((users_chats.user_id = 1
OR users_chats.foreign_user_id = 1)
OR (users_chats.user_id is NULL
AND users_chats.foreign_user_id is NULL))
ORDER BY `users_chats`.`created` DESC
Знаете ли вы, что ваши таблицы выглядят? – FrankieTheKneeMan
users_chats содержит id, to (int), from (int), сообщение и созданную дату :) – skrilled
@skrilled on SO всегда публикует структуру таблицы, образцы данных, ожидаемый результат и то, что вы пытались, чтобы люди не просили вас чтобы дать им больше информации. –