0

有这样的表(只是一个例子):

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

我想获得不同的类别,但前提是如果我使用状态是活动的

SELECT DISTINCT category FROM table WHERE status='active'

它不会将 cat2 作为 distict 值包括在内,即使它曾经显示为活动状态。我希望所有不同的类别都返回,即使它只出现一次。

我可以使用 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

有两条记录有category=Books>Art>Classicism. 第一个有status=0并且被 WHERE 子句排除,而第二个有status=1。您可以通过将第一条记录的 设置为to
来检查我的示例数据中是否没有拼写错误,您会看到它仍然只显示一次,但紧随其后作为第二条记录。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 回答