Разработка таблиц среднего и левого соединения - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь объединить среднее значение столбца rating на основе postid с другой таблицей.

Я создал этот код, который вычисляет среднее значение rating, и он работает:

SELECT post_rating.postid, 
       AVG(post_rating.rating) 
FROM post_rating 
GROUP BY post_rating.postid"

Однако, когда я пытаюсь присоединиться, это не работает, как показано ниже:

$join = ' LEFT JOIN ('SELECT post_rating.postid, 
                      AVG(post_rating.rating) 
                      FROM post_rating 
                      GROUP BY post_rating.postid') AS post_rating 
            ON post_rating.postid=theList.id';

Как мне присоединиться к этому коду или есть лучший способ сделать это?Спасибо!

Весь код, который я использую:

<?php

$pdo = new PDO('mysql:host=localhost;dbname=myDB', 'root', 'root');
$select = 'SELECT theList.id, theList.name, post_rating.rating, post_rating.postid';
$from = ' FROM theList';
$where = ' WHERE TRUE';
$join = ' LEFT JOIN ('SELECT post_rating.postid, AVG(post_rating.rating) FROM post_rating GROUP BY post_rating.postid') AS post_rating ON post_rating.postid=theList.id';
$opts = isset($_POST['filterOpts'])? $_POST['filterOpts'] : array('');
if (in_array("pub", $opts)){
$where .= " AND pub = 1";
}
if (in_array("bar", $opts)){
$where .= " AND bar = 1";
}
if (in_array("restaurant", $opts)){
$where .= " AND restaurant = 1";
}
if (in_array("club", $opts)){
$where .= " AND club = 1";
}

$sql = $select . $from . $join . $where;
$statement = $pdo->prepare($sql);
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
$json = json_encode($results);
echo($json);
?>

Вот упрощенные версии моих таблиц:

Таблица postid

id | postid | rating
--------------------
1  |    3   |    5
2  |    3   |    4
3  |    1   |    3

theList Table

id | name 
----------
1  | name1   
2  | name2   
3  | name3

По сути, я пытаюсь вывести:

id | name  | rating
------------------
1  | name1 |   3
2  | name2 |   0
3  | name3 |   4.5

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Я думаю, что вы подходите к этому запросу излишне сложным образом.Просто сделайте Left Join между таблицами, рассмотрите theList как крайнюю левую таблицу и вычислите Avg() в группе на postid:

SELECT tl.id, 
       tl.name, 
       AVG(pr.rating) AS rating 
FROM post_rating AS pr 
LEFT JOIN theList AS tl ON tl.id = pr.postid 
GROUP BY tl.id, tl.name  

Ваш PHP-кодбудет выглядеть следующим образом:

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=myDB', 'root', 'root');
$select = 'SELECT tl.id, 
                  tl.name, 
                  AVG(pr.rating) AS rating ';

$from = ' FROM post_rating AS pr ';
$where = ' WHERE 1 = 1 ';
$join = ' LEFT JOIN theList AS tl ON tl.id = pr.postid ';
$opts = isset($_POST['filterOpts'])? $_POST['filterOpts'] : array('');
if (in_array("pub", $opts)){
    $where .= " AND pub = 1";
}
if (in_array("bar", $opts)){
    $where .= " AND bar = 1";
}
if (in_array("restaurant", $opts)){
    $where .= " AND restaurant = 1";
}
if (in_array("club", $opts)){
    $where .= " AND club = 1";
}

$group = ' GROUP BY tl.id, tl.name ';

$sql = $select . $from . $join . $where . $group;
$statement = $pdo->prepare($sql);
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
$json = json_encode($results);
echo($json);
?>
0 голосов
/ 03 октября 2018

Теперь я вижу проблему, о которой вы пытались мне рассказать в своих предыдущих комментариях к вопросу, вы по какой-то причине завершили строку $join, поэтому большая часть запроса не будет включена

Итак, эта строка

$join = ' LEFT JOIN ('SELECT post_rating.postid, AVG(post_rating.rating) 
            FROM post_rating GROUP BY post_rating.postid') AS post_rating 
            ON post_rating.postid=theList.id';

(см. Код цвета, показывающий ошибку)

Поэтому измените на

$join = ' LEFT JOIN (SELECT post_rating.postid, AVG(post_rating.rating) 
            FROM post_rating GROUP BY post_rating.postid) AS post_rating 
            ON post_rating.postid=theList.id';

Могу ли я предложить вам добавить обработку ИСКЛЮЧЕНИЯ в PDO, чтобы вам сообщилиВаш браузер, когда есть ошибки.Сделайте это в вашем коде подключения

$pdo = new PDO(.......);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...