0

このようなテーブルを持つ(例のみ):

Program category status 
A         cat1    active
B         cat2    inactive
C         cat3    active
D         cat2    active

個別のカテゴリを取得したいのですが、使用する場合にステータスがアクティブな場合のみ

SELECT DISTINCT category FROM table WHERE status='active'

一度アクティブとして表示されたとしても、distic値としてcat2は含まれません。一度だけアクティブに表示された場合でも、すべての個別のカテゴリが返されるようにしたいと思います。

phpループを使用してこれを行うこともできますが、これは大きなテーブルであるため、すべてのカテゴリを返すわけではありません。

よろしくお願いします。初めての投稿ですが、StackOverFlowは何度も私を助けてくれました。


実際のテーブル構造は

CREATE TABLE cats (
    id int(11) NOT NULL AUTO_INCREMENT,
    programname varchar(100) NOT NULL DEFAULT '',
    sub0 varchar(300) DEFAULT NULL,
    sub1 varchar(300) DEFAULT NULL,
    sub2 varchar(300) DEFAULT NULL,
    sub3 varchar(300) DEFAULT NULL,
    sub4 varchar(300) DEFAULT NULL,
    category varchar(300) DEFAULT NULL,
    status varchar(1) DEFAULT NULL,
    PRIMARYKEY (id)
) ENGINE= InnoDBDEFAULT CHARSET= latin1;
4

3 に答える 3

3

これは次のように機能するようです。

SQLデモ

select distinct category
from demo
where status = 'active';

| CATEGORY |
------------
|     cat1 |
|     cat3 |
|     cat2 |

ここで適用する他の条件が本当にない限り、私たちに知らせる必要があるかもしれません:)

于 2013-02-26T08:23:16.203 に答える
2

まだ問題を再現できません。
次の例の出力は次のとおりです。

Books>Art>Modern
Books>Art>Concrete
Books>Art>Classicism
Books>Art>Naive

を持っている2つのレコードがありcategory=Books>Art>Classicismます。最初のstatus=0ものはWHERE句によって除外され、2番目のものはstatus=1。最初のレコードのをからに
設定することで、サンプルデータにタイプミスがないことを確認できます。これは、2番目のレコードとして1回だけ表示され、直後に表示されます。status01Books>Art>ClassicismBooks>Art>Modern

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);

$stmt = $pdo->query("SELECT DISTINCT category FROM soFoo WHERE status='1'", PDO::FETCH_ASSOC);
foreach( $stmt as $row ) {
    echo join(', ', $row), "\n";
}


function setup($pdo) {
    $pdo->exec("
        CREATE TEMPORARY TABLE soFoo (
            id int(11) NOT NULL AUTO_INCREMENT,
            programname varchar(100) NOT NULL DEFAULT '',
            sub0 varchar(300) DEFAULT NULL,
            sub1 varchar(300) DEFAULT NULL,
            sub2 varchar(300) DEFAULT NULL,
            sub3 varchar(300) DEFAULT NULL,
            sub4 varchar(300) DEFAULT NULL,
            category varchar(300) DEFAULT NULL,
            status varchar(8) DEFAULT NULL,
            PRIMARY KEY (id)
        ) ENGINE= InnoDB DEFAULT CHARSET= latin1;
    ");
    $stmt = $pdo->prepare('
        INSERT INTO
            soFoo
            (
                programname, sub0, sub1, sub2,
                sub3, sub4,
                category, status
            )
        VALUES
            (
                :programname, :sub0, :sub1, :sub2,
                :sub3, :sub4,
                :category, :status
            )
    ');
    $data = array();
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Modern', 'status'=>'1'
    );
    // this one has category='Books>Art>Classicism' and status=0
    // the second but last element is a copy of this one with status=1
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Classicism', 'status'=>'0'
    );
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Modern', 'status'=>'1'
    );
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Concrete', 'status'=>'1'
    );
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Classicism', 'status'=>'1'
    );
    $data[] = array(
        'programname'=>'BOOK Store',
        'sub0'=>'Books', 'sub1'=>'Art Books','sub2'=>'Modern Art',
        'sub3'=>null, 'sub4'=>null,
        'category'=>'Books>Art>Naive', 'status'=>'1'
    );

    foreach( $data as $rec ) {
        $stmt->execute($rec);
    }
}
于 2013-02-26T09:29:30.283 に答える
1

これを試して:

SELECT DISTINCT category 
FROM 
(SELECT category FROM table WHERE status='active') as temp
于 2013-02-26T08:20:08.333 に答える