Не могу разобраться с запросом mysql

У меня есть таблица комментариев:

id_comment text id_product id_user grade(enum)
20 что то 101 2 good
21 кто то 101 1 bad
22 там то 102 3 bad

->Пояснения: id_product у комментария - то к какому продукту добавлен комментарий. grade оценка, id_user кого это комментарий.

Есть таблица пользователей которые оценили какой либо комментарий:

id id_user id_comment grade(enum)
100 2 21 bad
101 2 20 bad
102 1 20 good
103 3 22 good
104 3 22 bad

->Пояснения: тут думаю понятно все. Таблица нужна что бы пользователь не мог добавлять много раз оценку, только 1 раз. id_user и id_comment не могут быть дубликатами. Делаю это, что бы пользователь обновлял оценку.

Я смог успешно вывести комментарии, и оценки к ним.


Проблема:

Когда пользователь входит в страницу с продуктом, он может быть авторизован, или он не авторизован. Если авторизован то у него есть idUser, если нет то нет. Когда авторизованный пользователь входит на страницу с продуктом, и я с помощи ajax подгружаю комментарии. Они отображаются и отображается их оценка(good/bad). Но, я не могу отобразить текущие оценки текущего пользователя.

Что нужно для этого?

  1. Использовать дополнительный запрос но к оценкам и с помощи массива соединять их? Я могу но хочу одним запросом.
  2. Делать одним запросом с помощи Join, то:
    • у меня idUser может быть пустым.
    • idUser есть но нет оценки.
    • С этим из-за не знаний я не могу сделать так что бы, если пользователь не авторизован или нет оценки выводилась текущая оценка пользователя у комментариев null.

Вот мой запрос:

выводил просто комментарии к товару:

  1. просто вывожу список комментариев к определенному продукту $sth = $this->db->prepare("SELECT id_comment, text, grade, product.name_product FROM comments INNER JOIN product ON product.id_product = comments.id_product WHERE comments.id_product = :id_product");
  2. вывожу список комментариев и к ним оценки $sth = $this->db->prepare("SELECT id_comment, text, grade, product.name_product, count(IF(grade_comment.grade = 'good', 1, NULL)) as c_good, count(IF(grade_comment.grade = 'bad', 1, NULL)) as c_bad FROM comments INNER JOIN product ON product.id_product = comments.id_product LEFT JOIN grade_comment ON grade_comment.id_comment = comments.id_comment WHERE comments.id_product = :id_product GROUP BY comments.id_comment");
  3. Не могу связать пользователя, что бы у каждого выведенного комментария была текущая оценка. Пробовал: $sth = $this->db->prepare("SELECT id_comment, text, grade, product.name_product, count(IF(grade_comment.grade = 'good', 1, NULL)) as c_good, count(IF(grade_comment.grade = 'bad', 1, NULL)) as c_bad, IFNULL(grade_comment.grade, null) as this_grade FROM comments INNER JOIN product ON product.id_product = comments.id_product LEFT JOIN grade_comment ON grade_comment.id_comment = comments.id_comment WHERE comments.id_product = :id_product AND comments.id_user = :id_user GROUP BY comments.id_comment");

И конечно он не будет работать. Я не знаю как вытащить к каждому комментарию оценку(существующею/текущею) оценку пользователя по id_user. Учитывая что оценки может и не быть, или id пользователя.

Помогите! Заранее извините если что за большую писанину.


Ответы (0 шт):