Не могу разобраться с запросом 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). Но, я не могу отобразить текущие оценки текущего пользователя.
Что нужно для этого?
- Использовать дополнительный запрос но к оценкам и с помощи массива соединять их? Я могу но хочу одним запросом.
- Делать одним запросом с помощи Join, то:
- у меня
idUserможет быть пустым. idUserесть но нет оценки.- С этим из-за не знаний я не могу сделать так что бы, если пользователь не авторизован или нет оценки выводилась текущая оценка пользователя у комментариев null.
- у меня
Вот мой запрос:
выводил просто комментарии к товару:
- просто вывожу список комментариев к определенному продукту
$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"); - вывожу список комментариев и к ним оценки
$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"); - Не могу связать пользователя, что бы у каждого выведенного комментария была текущая оценка. Пробовал:
$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 пользователя.
Помогите! Заранее извините если что за большую писанину.