2

テーブル 'products' からいくつかの製品を、テーブル 'product_licenses' から最低価格とともに出力する必要があります。これは、このクエリでそのテーブルから必要な唯一の列です。

ただし、SQL 関数 MIN() を使用しようとすると、ループはコードを 1 回だけ実行し、最初の結果を取得してから停止するため、ここで少し迷ってしまいます。

これは min() を使用したクエリです。

$mysql->query("
    SELECT pd.*, min(lc.price) AS price
    FROM `products` AS pd, product_licenses AS lc
    WHERE pd.`status` = '1' AND lc.product_id = pd.id
    ORDER BY pd.`id` ASC
    $limitQuery
");

この関数を使用して製品を取得していますが、残念ながら、これは最高の価格を取得します。

public function getAllProducts($start = 0, $limit = 0, $order = '`datetime` ASC') {
    global $mysql;


    $limitQuery = '';
    if ($limit != 0) {
        $limitQuery = " LIMIT $start,$limit ";
    }
    **// Not working if I use min() on lc.price**
    $mysql->query("
        SELECT pd.*, lc.price
        FROM `products` AS pd, product_licenses AS lc
        WHERE pd.`status` = '1' AND lc.product_id = pd.id
        ORDER BY pd.`id` ASC
        $limitQuery
    ");

    if ($mysql->num_rows() == 0) {
        return false;
    }

    $this->usersWhere = '';
    $return = array();
    while ($d = $mysql->fetch_array()) {
        $categories = explode(',', $d['category_id']);
        unset($d['category_id']);
        foreach ($categories as $c) {
            $c = trim($c);
            if ($c != '') {
                $d['category_id'][$c] = $c;
            }
        }

        $return[$d['id']] = $d;
    }

    $this->foundRows = $mysql->getFoundRows();

return $return;
}
4

3 に答える 3

4

クエリに句がないgroup byため、クエリは最初の行のみを返します。

SELECT pd.col1, pd.col2, pd.col3,  min(lc.price) AS price
FROM `products` AS pd, product_licenses AS lc
WHERE pd.`status` = '1' AND lc.product_id = pd.id
group by pd.col1, pd.col2, pd.col3
ORDER BY pd.`id` ASC
$limitQuery
于 2012-08-27T13:43:22.283 に答える
4

GROUP BY次のように、そこにa が必要です。

SELECT pd.*, min(lc.price) AS price
FROM `products` AS pd, product_licenses AS lc
WHERE pd.`status` = '1' AND lc.product_id = pd.id
GROUP BY pd.`id`
ORDER BY pd.`id` ASC
$limitQuery

MySQL では、製品テーブルから他の列を選択している場合でも、id 列でグループ化する必要があるだけであることに注意してください。

于 2012-08-27T13:43:27.653 に答える
4

クエリに追加GROUP BYします。集計関数 ( MIN ) を使用しているがグループ化していないため、現在のクエリは 1 つの結果のみを返します。

SELECT  pd.col1, 
        pd.col2, min(lc.price) AS PRICE
FROM   `products` AS pd
             INNER JOIN product_licenses AS lc
                  ON lc.product_id = pd.id
WHERE    pd.`status` = '1' 
GROUP BY pd.col1, pd.col2, pd.col3
ORDER BY pd.`id` ASC
$limitQuery

PS: データベースの構造をレコードとともに投稿してください。コミュニティがあなたの質問を明確に理解するでしょう:)

于 2012-08-27T13:44:03.427 に答える