0

group_concat を使用せずにこれを行う方法を考えていました。私のレビューは非常に長いため、group_concat はそれらを使い果たしているため、すべてのレビューが返されるわけではありません。他に考えられる唯一の方法は、クエリをループすることです。いくつかの製品と各製品のいくつかのレビューがあることを知っているだけです. 何か案は?

    $this->db->select("product.id,
        product.name as name,
        group_concat(user.name) as user,
        group_concat(rating.overall) as overall,
        group_concat(rating.description SEPARATOR '|') as review");
    $this->db->join('rating', 'rating.idProduct = alcohol.id', 'LEFT');
    $this->db->join('user', 'user.id = rating.idUser', 'LEFT');
    $query = $this->db->get('product');
    return $query->result();

次のように出力します。

[0] => stdClass Object (
        [name] => Product
        [reviews] => Array(
                [0]=> (
                        [user] => "cKendrick "
                        [overall] => "1"
                        [Rating] => "lalalalalala review"
                    )
                [1] = >
                    (...
    )

)
[1] => stdClass Object (..

アップデート:

"SELECT product.id,
  product.name as name,
  category.permName as category,
  subCategory.permName as subCategory,
  product.permName as permName,
  product.picture as picture,
  user.username as username,
  user.firstName as firstName,
  user.lastName as lastName,
  user.picture as userPicture,
  rating.description as review
FROM (
     SELECT *
     FROM product
     LIMIT ?, 30
) product
LEFT JOIN category
    ON category.id = product.category
LEFT JOIN subCategory
    ON subCategory.id = product.subCategory
LEFT JOIN rating
    ON rating.idAlcohol = product.id
LEFT JOIN user
    ON user.id = rating.idUser
ORDER BY product.lastReview desc"

カテゴリごとに制限するにはどうすればよいですか?

4

2 に答える 2

0

どの DBAL を使用していますか? 単純な古いPHPでは、本当に単一のクエリを使用したい場合は、次のようにすることができます-

<?php

$db = new PDO('dsn', 'user', 'pass');
$sql = "SELECT product.id, product.name, rating.overall, rating.description, user.name AS user  
        FROM (
           SELECT *
           FROM product
           LIMIT 30
        ) product   
        LEFT JOIN rating
            ON product.id = rating.productId   
        LEFT JOIN user
            ON user.id = rating.userId";

$stmt = $db->prepare($sql);
$stmt->execute();

$output = array();
while ($row = $stmt->fetchObject()) {
    $output[$row->id]['name'] = $row->name;
    $output[$row->id]['reviews'][] = array('user'        => $row->user,
                                           'overall'     => $row->overall,
                                           'description' => $row->description);
}

更新- 製品数を制限できるように、製品テーブルをサブクエリに移動しました。製品のフィルタリングは、外部選択ではなくサブクエリに追加する必要があることに注意してください。

UPDATE - 質問の更新に基づいて更新されたクエリ。結果を制限する前にカテゴリに基づいて製品をフィルタリングしたいので、結合と基準をサブクエリに追加する必要があります -

SELECT product.id,
    product.name as name,
    product.category,
    product.subCategory,
    product.permName as permName,
    product.picture as picture,
    user.username as username,
    user.firstName as firstName,
    user.lastName as lastName,
    user.picture as userPicture,
    rating.description as review
FROM (
    SELECT
        p.*,
        category.permName AS category,
        subCategory.permName AS subCategory
    FROM product
    LEFT JOIN category
        ON category.id = product.category
    LEFT JOIN subCategory
        ON subCategory.id = product.subCategory
    WHERE category.permName = ?
    LIMIT ?, 30
) product
LEFT JOIN rating
    ON rating.idAlcohol = product.id
LEFT JOIN user
    ON user.id = rating.idUser
ORDER BY product.lastReview desc
于 2012-04-12T23:27:57.573 に答える
0

ここに私の仮定があります:

評価が関連付けられているすべての製品を取得する必要があります。誰がどのレビューを書いたか知りたい。

 select product.id, product.name, rating.overall, rating.description, user.name 
from product 
left join rating on product.id = rating.productId 
left join on user.id=rating.userId;

これがあなたの望むものでない場合は、投稿を編集して、あなたが探しているもののいくつかの行を表示してください。

于 2012-04-12T21:23:02.543 に答える