2014-02-04 3 views
0

У меня есть следующий РЕГИСТРИРУЙТЕСЬ запрос уже сделан:Как соединить эти 3 таблицы

$stmt = $cxn->prepare('SELECT p.post_id, p.reply_to, p.parent_id, p.post_path, p.user_id, p.content, p.datetime, p.total_likes, p.total_replies, p.total_reposts, u.username, u.display_name FROM posts p LEFT JOIN users u ON p.user_id = u.user_id WHERE p.user_id IN (SELECT following_id FROM follows WHERE user_id = ?) AND p.removed != 1 ORDER BY p.datetime DESC LIMIT 26'); 
$stmt->bind_param('i', $user_info[0]); 
$stmt->execute(); 

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

$stmt = $cxn->prepare('SELECT COUNT(like_id) FROM likes WHERE post_id = ? AND user_id = ?'); 
$stmt->bind_param('ii', $row['post_id'], $user_info[0]); // $row['post_id'] is the value of p.post_id from the first query 
$stmt->execute(); 

Как я бы включил второй запрос в первый? Я никогда не входил в 3 таблицы, поэтому я не уверен в этой процедуре.

Спасибо.

+0

Это вообще плохая форма, чтобы удалить вопрос, как this- вы можете использовать анонимизированные имена таблиц чтобы позволить будущим пользователям также воспользоваться вашим вопросом? – Anov

ответ

0

Объединение трех таблиц в запрос похоже на объединение двух, за исключением ... вы присоединяетесь к трем.

В основном это бы что-то вроде этого:

SELECT p.post_id (...), u.username (...), COUNT(l.like_id) AS nbOfLikes 
    FROM posts p 
    LEFT JOIN users u ON p.user_id = u.user_id 
    LEFT JOIN likes l ON l.post_id = p.post_id AND l.user_id = u.user_id 
    WHERE p.user_id IN 
     (SELECT following_id 
      FROM follows 
      WHERE user_id = ?) 
    AND p.removed != 1 
    ORDER BY p.datetime DESC 
    LIMIT 26; 

- На самом деле я думаю, что UNION возможно будет более адаптирован к вашей потребности в отношении к likes таблице.

+0

Что такое 'AS likeNumber'? – Walter

+0

Это имя для вашей 'count (l.like_id)' части. Таким образом, в вашем PHP-коде вы будете ссылаться на него как 'likeNumber' (а также, если вам это нужно, дальше в запросе SQL, что более удобно). Но это необязательно. – Jivan

+0

@ user3268045, но я согласен, что это не лучшее имя, которое я мог бы найти. 'numberOfLikes' был бы более точным. – Jivan

0

Если у вас всегда есть user_id, заполненный вашими табличными сообщениями, и это внешний ключ, избегайте использования левого оператора объединения, вы можете получить более высокую производительность с помощью оператора объединения. Для того, чтобы присоединиться к 3 или более таблиц, вы можете просто добавить присоединиться заявление: ВЫБРАТЬ p.post_id , p.reply_to , p.parent_id , p.post_path , p.user_id , p.content , p.datetime , p.total_likes , p.total_replies , p.total_reposts , u.username , u.display_name ОТ сообщений р РЕГИСТРИРУЙТЕСЬ пользователей U = О p.user_id u.user_id ГДЕ p.user_id В (ВЫБРАТЬ ИЗ following_id следует JOIN TABLE_2 ON TABLE_2.id = posts.TABLE_id JOIN TABLE_3 ВКЛ TABLE_3.id = posts.TABLE _id ... ГДЕ user_id =?) И p.removed! = 1 ORDER BY p.datetime DESC LIMIT 26

Смежные вопросы