有一个这样的表(只是一个例子):
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;
答案 0 :(得分:3)
似乎这样工作:
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
设置为0
到1
来检查我的示例数据中是否存在拼写错误,您会看到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