如何在同一列中选择多个值?

14

我正在尝试选择单个列中的多个值。基本上,我希望查询选择列family下所有具有值Software_1YXI_1YP1_1Y的行。

我正在运行以下查询:

SELECT `salesorder`
    ,`masterproduct`
    ,`family`
    ,`birthstamp`
    ,`duedate`
    ,COUNT(*) AS `total`
FROM `report`
WHERE `birthstamp` BETWEEN '$startDT'
        AND '$endDT'
    AND `family` = 'Software_1Y'
    AND `family = 'XI_1Y'
    AND `family` = 'PI_1Y'
GROUP BY `salesorder`
    ,`masterproduct`
    ,`family`
    ,`duedate`;

我的查询没有返回任何行,但是如果我逐个搜索每个家庭,我就有值。

我的查询有什么问题?

此外,我的目的是获取所有 family 值为 Software_1YXI_1YPI_1Y 的行。


使用 IN 或更改为 \family` = 'Software_1Y' OR `family` = 'XI_1Y' OR `family` = 'PI_1Y'`。 - hjpotter92
请纠正我,如果我使用OR,那么我只能得到一行数据,对吗?我的目的是获取所有具有这些family值的行。 - Jude
2个回答

18

使用IN怎么样呢?

SELECT  `salesorder`,
        `masterproduct`,
        `family`,
        `birthstamp`,
        `duedate`, 
        COUNT( * ) AS `total` 
FROM    `report` 
WHERE   `birthstamp` BETWEEN '$startDT' AND '$endDT' 
AND     `family` IN ('Software_1Y','XI_1Y','PI_1Y')
GROUP BY    `salesorder`,
            `masterproduct`,
            `family`,
            `duedate`;

没有返回任何值的原因在于这部分代码:

AND `family` = 'Software_1Y' 
AND `family = 'XI_1Y' 
AND `family` = 'PI_1Y'

family 不能同时是这3个值,但它可能是这3个值中的1个。

这就是为什么你需要使用 IN。

另一种看待它的方式是使用 OR,但那会变得非常冗长。


2
这意味着您的 SQL 语句存在错误。您难道没有检查 mysql_query 返回的错误吗?错误信息应该会告诉您出错的位置。 - Barmar
这绝对是关于这类查询最好的解释。感谢astander。 - Samuel Ramzan

1
$query="   SELECT `salesorder`,`masterproduct`,`family`,`birthstamp`,`duedate`, COUNT( * ) AS `total` FROM `report` 
    WHERE `birthstamp` BETWEEN '$startDT' AND '$endDT' 
           AND (`family` = 'Software_1Y' 
           OR `family` = 'XI_1Y' 
           OR `family` = 'PI_1Y') 
    GROUP BY `salesorder`,`masterproduct`,`family`,`duedate` ";

查询FAMILY列时,必须使用AND而不是OR。

$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) 
{
//Operation you want to perform
}

@jude:看起来你直接将字符串类型的查询作为参数直接传递给了mysql_fetch_array,这是错误的。相反,请按照上述方法进行操作...


1
你可能想在OR语句周围加上一些括号...AND (family = 'Software_1Y' OR family = 'XI_1Y' OR family = 'PI_1Y') - Adriaan Stander
@astander:是的...我也想到了。但是我又想,这真的会影响到这种特殊情况下的条件吗? - Viral Jain
是的,它肯定会。因为您已经按照操作符的顺序排列:('$startDT' AND '$endDT' AND family = 'Software_1Y') OR family = 'XI_1Y' OR family = 'PI_1Y'。 - Adriaan Stander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接