2012-01-25 2 views
4

Я пытаюсь выбрать данные из 4 таблицы (последняя таблице нужна считать данные)Добавить еще одну таблицы для запроса и сосчитать данные SQL

Моей MySQL таблица структуры

пользователей

id 
username 

изображения

id 
user_id 
image 

user_follow

id 
user_id 
follow_id 

комментарии

id 
user_id 
image_id 
text 

Я получил этот SQL-запрос:

$sql = "SELECT u.username as user, i.image as user_image, p.image, p.date 
      FROM users u    
      LEFT JOIN user_follow f ON u.id = f.follow_id 
      LEFT JOIN images p ON p.user_id = u.id 
      LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1) 
      WHERE f.user_id = 3 OR p.user_id = 3  
      ORDER BY p.date DESC"; 

Эта линия тока возврата ОЯ (последнее изображение)

LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1) 

он возвращает все изображения из я и мои друзья

[0] => Array 
    (
     [user] => 8888 
     [user_image] => second.jpg 
     [image] => second.jpg 
     [date] => 2012-01-24 14:42:27 
    ) 

[1] => Array 
    (
     [user] => 8888 
     [user_image] => second.jpg 
     [image] => first.jpg 
     [date] => 2012-01-24 14:42:27 
    ) 

[2] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => ax46l7v7vugnesk10whk_339.jpg 
     [date] => 2012-01-24 01:54:19 
    ) 

[3] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => aaaaaaaa.jpg 
     [date] => 2012-01-24 01:49:57 
    ) 

Я пытался добавить

left join commentaries c ON c.user_id = u.id 

и результат был

[2] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => ax46l7v7vugnesk10whk_339.jpg 
     [date] => 2012-01-24 01:54:19 
     [id] => 1 
    ) 

[3] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => ax46l7v7vugnesk10whk_339.jpg 
     [date] => 2012-01-24 01:54:19 
     [id] => 2 
    ) 

[4] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => aaaaaaaa.jpg 
     [date] => 2012-01-24 01:49:57 
     [id] => 1 
    ) 

[5] => Array 
    (
     [user] => 3333 
     [user_image] => ax46l7v7vugnesk10whk_339.jpg 
     [image] => aaaaaaaa.jpg 
     [date] => 2012-01-24 01:49:57 
     [id] => 2 
    ) 

Дубликат пользователя, если он есть комментарии (кстати [пользователь] => 3333 имеют 2 комментарии в примере)

Я пытаюсь добавить еще один комментарий «комментариев» и подсчитать, сколько комментариев имеет каждое изображение (от меня и моих друзей), если нет комментариев с таким $ user_id, а затем возвращает 0

+0

Это не похоже, что комментарии связаны с изображениями. В таблице 'commentaries' должен быть столбец' image_id'. – piotrm

+0

Вы правы, я добавил в свою базу данных еще одно поле image_id, но до сих пор не знаю, как добавить «комментарии» в таблицу и подсчитать изображения – Viktors

ответ

2

Вам необходимо использовать GROUP BY для подсчета строк в группах (в вашем случае комментарии для каждого изображения). Этот запрос должен сделать трюк:

SELECT u.username as user, i.image as user_image, p.image, p.date, 
      COALESCE (imgcount.cnt, 0) as comments 
      FROM users u    
      LEFT JOIN user_follow f ON u.id = f.follow_id 
      LEFT JOIN images p ON p.user_id = u.id 
      LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1) 
      LEFT JOIN 
      (SELECT image_id, COUNT(*) as cnt FROM 
       commentaries 
       GROUP BY image_id ) imgcount 
      ON p.id = imgcount.image_id 
      WHERE f.user_id = 3 OR p.user_id = 3  
      ORDER BY p.date DESC 
2

Вы действительно знаете, как задать вопрос путанице. Проблема в том, что вы не понимаете последствий своих объединений.

Использование вашего примера. У вас есть таблица (пользователи в этом случае), которая имеет один-много отношений к двум другим таблицам (изображения и комментарии).

Такие, как это:

  users 
     / \ 
    images  commentaries 

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

Это:

SELECT * 
FROM users u 
LEFT JOIN images p ON p.user_id = u.id 
LEFT JOIN commentaries c ON c.user_id = u.id 

точно так же, как это:

SELECT * 
FROM images p 
LEFT JOIN commentaries c ON c.user_id = p.user_id 

(с точки зрения количества записей производства)

Было бы хорошо, если один из детей таблицы имели отношение 1 к 1 с родительской таблицей, но это не так.Поскольку у них обоих есть несколько записей в них, эффект - ПОЛНАЯ ВНЕШНЯЯ ВСТУПЛЕНИЕ, и результатом является умножение количества записей, созданных на выходе. Вывод будет содержать число или записи, равные количеству совпадающих записей в одной таблице, умноженному на количество совпадающих записей в другой таблице. Таким образом, поскольку у вас есть две записи в каждой таблице, соответствующие этому user_id, набор результатов содержит четыре записи.

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

Следующая строка чрезвычайно запутанна.

Посчитайте, сколько комментариев есть каждая картина

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

$sql = "SELECT u.username as user, i.image as user_image, p.image, p.date, c.commentcount 
     FROM users u    
     LEFT JOIN user_follow f ON u.id = f.follow_id 
     LEFT JOIN images p ON p.user_id = u.id 
     LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1) 
     LEFT JOIN (SELECT x.user_id, COUNT(*) AS commentcount FROM commentaries x GROUP BY x.user_id) c ON c.user_id = u.id 
     WHERE f.user_id = 3 OR p.user_id = 3  
     ORDER BY p.date DESC"; 

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

По существу, это дает только количество комментариев, которые пользователь имеет. Это не имеет никакого отношения к изображениям. Вы можете использовать очень похожий код, чтобы рассказать вам, сколько изображений у пользователя есть, но это не имеет никакого отношения к комментариям.

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

Если вы можете уточнить свои намерения, я могу помочь больше. В противном случае я надеюсь, что это поможет.

+0

Ха, ну, теперь, когда вы изменили структуру данных, я полагаю, что ответ Пиотма, вероятно, отвечает ваш вопрос. –

+0

этот запрос не учитывает комментарии для каждого изображения. Он подсчитывает и возвращает для каждого изображения, сколько комментариев имеет такой пользователь. Например, (user_id = 3) прокомментировали один раз (image_id = 5) и (image_id = 6). Поэтому, говоря о каждом изображении, он должен возвращать image_id = 5, где comment_count = 1 и image_id = 6 comment_count = 1 – Viktors

+0

Итак, если это цель, будет ли код, который я написал, не работает? –

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