0

我有一个 MySQL 查询,需要根据传递给它的参数进行更改。听起来很简单,对吧?问题是,如果参数为“0”,我需要它来获取所有记录。

我怎样才能做到这一点?

这是我到目前为止所拥有的。

public function getLatestWork($numberOfSlides, $type = 0) {

    $params = array();
    $params["numberOfSlides"] = $numberOfSlides;
    $params["type"] = $type;

    $STH = $this->_db->prepare("SELECT slideID 
        FROM slides
        WHERE visible = 'true'
            AND type = :type
        ORDER BY order
        LIMIT :numberOfSlides;");

    $STH->execute($params);

    $result = $STH->fetchAll(PDO::FETCH_COLUMN);

    return $result;        
}

更新: $numberOfSlides 与问题无关。它总是会返回一定数量的结果。这都是关于$type如果它设置为“0”(默认值),那么它基本上会忽略 WHERE 语句的那一部分。如果它设置为“1”或“2”等,那么它只提取该类型的记录。

显然,我可以根据 $type 的值更改 $STH 的值,但我想知道是否有更好的方法。

4

2 回答 2

2

我会使用nullififnull功能:

SELECT slideID 
FROM slides
WHERE visible = 'true'
    AND ifnull(nullif(:type, 0), type) = type
ORDER BY "order"
LIMIT :numberOfSlides;

如果:type0然后nullif返回null,如果nullif返回null ifnulltype列返回值,所以如果你传递:type = 0 结果将是type = type- 表示“所有行”。

于 2012-05-16T10:18:15.193 回答
1
public function getLatestWork($numberOfSlides, $type = 0) {
    $params = array();
    $params["numberOfSlides"] = $numberOfSlides;
    $params["type"] = $type;

    $STH = $this->_db->prepare("SELECT slideIDFROM slides WHERE visible = 'true' "
               . ($type > 0 ? "AND type = :type" : "") 
               . " ORDER BY order LIMIT :numberOfSlides;");

    $STH->execute($params);

    $result = $STH->fetchAll(PDO::FETCH_COLUMN);

    return $result;        
}
于 2012-05-16T10:56:17.703 回答