簡體   English   中英

從3個不同的表中查詢幾行

[英]Query several rows from 3 different tables

我想知道如何在不使用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"

我如何按類別限制它?

這是我的假設:

您想要獲得所有具有相關評級的產品。 您想知道誰撰寫了哪些評論。

 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;

如果這不是您想要的,請編輯您的帖子,並顯示幾行您想要的內容。

您正在使用哪個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM