PHP CodeIgniter несколько LEFT OUTER присоединиться к запросу - PullRequest
1 голос
/ 28 октября 2019

Я использую PHP CodeIgniter для запроса из моей базы данных. Мне нужно использовать несколько левых внешних соединений. Соединение использует несколько условий (я не уверен, что оно поддерживается на момент ошибки). Результаты моего запроса имеют одинаковое значение для обоих параметров, которые я хочу получить:

Запрос:

$this->db->select('anonymous.*,
    count(items_likes.id) as all_likes, count(items_comments.id) as all_comments');
    $this->db->from('anonymous');
    $this->db->where('anonymous.fid', $feed_id);

    $this->db->group_by('anonymous.id');

    $this->db->join('all_users', 'all_users.id = anonymous.uid', 'left outer');
    $this->db->join('images', 'images.ud = anonymous.uid AND images.fid = anonymous.fid', 'left outer');
    $this->db->join('items_likes', 'items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid', 'left outer');

    $this->db->join('items_comments', 'items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid', 'left outer');

    $list = $this->db->get()->result();

анонимный: это таблица с незарегистрированными пользователями

fid: идентификатор ленты

images: таблица всех изображений, которые были загружены в ленту

items_likes: это все лайки пользователей на изображение

items_comments: это комментарии всех пользователей на изображение


Проблема в том, что all_comments всегдавернуть то же значение, что и all_likes. Я не уверен, является ли проблема множественным объединением LEFT-OUTER или, возможно, тот факт, что я использую несколько условий в каждом операторе объединения, например,

items_comments.uid = anonymous.uid AND items_comments. fid = anonymous.fid

Результат журнала:

"all_likes":"12","all_comments":"12"

, хотя у меня 12 лайков, комментарии должны быть 3

Если я напишу запрос какследует за результатом в порядке:

$this->db->select('anonymous.*,
(SELECT count( items_likes.id ) FROM items_likes WHERE items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid) as all_likes, 
(SELECT count( items_comments.id ) FROM items_comments WHERE items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid) as all_comments');
$this->db->from('anonymous');
$this->db->where('anonymous.fid', $feed_id);

$this->db->group_by('anonymous.id');

$this->db->join('all_users', 'all_users.id = anonymous.uid', 'left outer');
$this->db->join('images', 'images.ud = anonymous.uid AND images.fid = anonymous.fid', 'left outer');
//$this->db->join('items_likes', 'items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid', 'left outer');

//$this->db->join('items_comments', 'items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid', 'left outer');

$list = $this->db->get()->result();

1 Ответ

1 голос
/ 28 октября 2019

При левом внешнем соединении создается полный набор записей из таблицы A с совпадающими записями (если они есть) в таблице B. Если совпадений нет, правая сторона будет содержать ноль.

Вам нужно добавить записи, которые содержат NULL

добавить это условие where к вашему запросу:

$this->db->->where('items_comments.uid IS NULL')    

больше информации о соединениях здесь

...