与MYSQL中的条件不同

时间:2013-02-26 08:15:19

标签: php mysql database distinct conditional-statements

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

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;

3 个答案:

答案 0 :(得分:3)

似乎这样工作:

SQL DEMO

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

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

除非你真的有其他条件要在这里申请,你可能需要告诉我们:)

答案 1 :(得分:2)

我仍然无法重现这个问题 以下示例的输出是

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

有两条记录category=Books>Art>Classicism。第一个有status=0,被WHERE子句排除,而第二个有status=1 您可以通过将第一条记录的status设置为01来检查我的示例数据中是否存在拼写错误,您会看到Books>Art>Classicism仍然只显示一次,但在Books>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);
    }
}

答案 2 :(得分:1)

试试这个:

SELECT DISTINCT category 
FROM 
(SELECT category FROM table WHERE status='active') as temp