Mysql Where子句

Mysql Where子句,mysql,where-clause,Mysql,Where Clause,我有一个mysql表,其中包含一个名为sequence的列 这是我的声明: SELECT a.modelyear, count(*) as yearcount FROM styles a, jpgs b, models c, divisions d WHERE d.divisionid = c.divisionid AND a.styleid = b.styleid AND c.modelid = a.modelid AND a.mktclassid in ($this->mktclass

我有一个mysql表,其中包含一个名为sequence的列

这是我的声明:

SELECT
a.modelyear,
count(*) as yearcount
FROM styles a, jpgs b, models c, divisions d
WHERE d.divisionid = c.divisionid
AND a.styleid = b.styleid
AND c.modelid = a.modelid
AND a.mktclassid in ($this->mktclassids)
AND a.sequence = 0
$this->where
GROUP BY a.modelyear;
上述查询应输出与此查询相同的计数:

select count(distinct(modelid)) from styles where mktclassid in ($this->mktclassids)
$this->where
我的问题是为了获得计数的每个唯一modelid。序列可以等于0或1,但不能同时等于两者。 因此modelid可能有一个序列=0。如果它不等于0,那么它将等于1。 我需要在where子句中添加if语句

这就是我认为我需要的:

if modelid has a.sequence = 0, then use a.sequence = 0
else modelid does not have a.sequence = 0, then use a.sequence = 1
我不是mysql的人,如果我没有表达我的需要,我很抱歉。。 基本上,如果modelid没有sequence=0,那么sequence=1

对于每个模型,“样式”表有许多修剪级别。第一次修剪将等于0或1。这是样式表的一个示例

styleid modelid sequence
350422  25156   1
350425  25156   4
350426  25156   5
350427  25156   7
350428  25156   11
350429  25156   6
350432  25156   9
350433  25156   10
356717  25156   8

styleid modelid sequence
308367  18875   0
308368  18875   1
308369  18875   2
308370  18875   3
308371  18875   4
我正在尝试从此表中获取distinst modelid。 我不相信我可以使用DISTINCT,因为它会影响我的整个查询

所以你可以看到这个模型没有sequence=0,所以我需要使用sequence=1 可能a包含1或0…我不确定 非常感谢您的帮助 谢谢你试过了吗

...
AND (a.sequence=0 OR a.sequence=1)
...
我会进行连接,而不是使用所有WHERE语句来优化这个查询

SELECT
    a.modelyear,
    count(*) as yearcount
FROM
    styles a
    INNER JOIN jpgs b ON (a.styleid = b.styleid)
    INNER JOIN models c ON (c.modelid = a.modelid)
    INNER JOIN divisions d ON (d.divisionid = c.divisionid)
WHERE
    a.mktclassid in ($this->mktclassids)
    AND (a.sequence=0 OR a.sequence=1)
    $this->where
GROUP BY 
    a.modelyear;
上面的查询将获得序列为1或0的所有项。下一个查询让我思考了一下。我将用查询注释
#
进行解释,但它应该得到不同时具有1和0序列的项:

SELECT
    a.modelyear,
    count(*) as yearcount
FROM
    styles a
    INNER JOIN jpgs b ON (a.styleid = b.styleid)
    INNER JOIN models c ON (c.modelid = a.modelid)
    INNER JOIN divisions d ON (d.divisionid = c.divisionid)
WHERE
    a.mktclassid in ($this->mktclassids)
    #above same as previous
    #and where modelid is in modelids either having sequence 0 or 1 but not both:
    AND a.modelid IN (
        #SELECT modelids that have either sequence 0 or 1 but not both
        SELECT
            styles.modelid
        FROM
            styles
        WHERE
            (
                styles.modelid IN (#modelids having sequence 0 but not 1
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=0
                    GROUP BY
                        styles.modelid
                ) AND 
                styles.modelid  NOT IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=1
                    GROUP BY
                        styles.modelid
                ) 
            )
            OR
            (
                styles.modelid NOT IN (#modelids having sequence 1 but not 0
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=0
                    GROUP BY
                        styles.modelid
                ) AND 
                styles.modelid IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=1
                    GROUP BY
                        styles.modelid
                ) 
            )
    )
    $this->where
GROUP BY 
    a.modelyear 
我希望这不会太令人困惑

用户声明查询将永远运行。试试这个子查询部分,让我知道它的性能

        SELECT
            styles.modelid
        FROM
            styles
        WHERE
            (
                styles.modelid IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=0
                    GROUP BY
                        styles.modelid
                ) AND 
                styles.modelid  NOT IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=1
                    GROUP BY
                        styles.modelid
                ) 
            )
            OR
            (
                styles.modelid NOT IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=0
                    GROUP BY
                        styles.modelid
                ) AND 
                styles.modelid IN (
                    SELECT
                        styles.modelid
                    FROM
                        styles
                    WHERE
                        styles.sequence=1
                    GROUP BY
                        styles.modelid
                ) 
            )
因此,我只是希望从表中获得不同的modelid,但最好是序列为0或1-OP

这正是我需要的。如何将其作为where子句添加到原始查询中OP

其结果与以下相同:

SELECT
a.modelyear,
count(*) as yearcount
FROM styles a, jpgs b, models c, divisions d
WHERE d.divisionid = c.divisionid
AND a.styleid = b.styleid
AND c.modelid = a.modelid
AND a.mktclassid in ($this->mktclassids)
AND a.modelid IN (
    SELECT
        modelid
    FROM
        styles
    GROUP BY
        modelid
)
$this->where
GROUP BY a.modelyear;
但我认为这不是你真正想要的。您不需要将其作为WHERE子句,但需要有一个完全更好的查询。其他桌子需要吗?
$this->
在哪里等同于什么?

再考虑一个小时后,我想这可能是你真正想要的。这将样式表限制为仅一个modelid,并将它们按最低顺序排序,然后将它们连接到其他表上,并应用mktclassid IN子句和
$This->where
子句:

SELECT
a.modelyear,
count(*) as yearcount
FROM
    (
        SELECT
            *
        FROM
            (
            SELECT
                *
            FROM
                styles
            ORDER BY
                sequence ASC
            ) subquery
        GROUP BY
            modelid
    ) a
    INNER JOIN jpgs b ON (a.styleid = b.styleid)
    INNER JOIN models c ON (c.modelid = a.modelid)
    INNER JOIN divisions d ON (d.divisionid = c.divisionid)
WHERE 
    a.mktclassid in ($this->mktclassids) AND
    $this->where
GROUP BY a.modelyear;

在这之后,我已经完成了,除了澄清你的问题之外,我没有更多的建议了,请提供一份报告,并给出更多预期产出的例子。有时候,你面临的问题是因为你试图做的事情是以错误的方式进行的。如果可能的话,总是给出你为什么要做一些事情的原因,而不仅仅是我的问题。。。其他人可能能够简化流程,并提供解决实际问题的解决方案。祝你好运

我不明白这个问题。你说序列是0或1,但是你的样式表示例显示了很多不是0或1的序列,并且没有一个是0。你能发布一个更完整的输入表示例,以及你希望从中获得的输出吗?也许做一把小提琴。OP不知道他到底想要什么。请参阅下面我的答案和所有评论。OP需要澄清他需要什么,应该用一个数据库示例和一个试图访问的示例输出,以及什么没有给出正确的输出。顺序对OP所说的他需要的最后一条评论没有影响……这不起作用,因为大多数TRIM的顺序为1,顺序为0。大约有50个表没有sequence=0,但sequence=1。基本上,如果它有sequence=0,那么它有sequence=1,但反之亦然。@user2506624您将必须提供其他一些表的更多详细信息。如何使一行同时是序列0和序列1。听起来你需要一个subqueryI编辑我的原始帖子,希望澄清我在寻找什么for@user2506624请看编辑后的答案,希望不要太混乱。我试过了,但无法运行,sequelpro正在抱怨f,g,h,I,e。但是去掉这些,查询将永远运行。结果会显示给用户,因此速度非常重要。型号年不正确您是指序列吗?
SELECT
a.modelyear,
count(*) as yearcount
FROM styles a, jpgs b, models c, divisions d
WHERE d.divisionid = c.divisionid
AND a.styleid = b.styleid
AND c.modelid = a.modelid
AND a.mktclassid in ($this->mktclassids)
AND a.modelid IN (
    SELECT
        modelid
    FROM
        styles
    GROUP BY
        modelid
)
$this->where
GROUP BY a.modelyear;
SELECT
a.modelyear,
count(*) as yearcount
FROM
    (
        SELECT
            *
        FROM
            (
            SELECT
                *
            FROM
                styles
            ORDER BY
                sequence ASC
            ) subquery
        GROUP BY
            modelid
    ) a
    INNER JOIN jpgs b ON (a.styleid = b.styleid)
    INNER JOIN models c ON (c.modelid = a.modelid)
    INNER JOIN divisions d ON (d.divisionid = c.divisionid)
WHERE 
    a.mktclassid in ($this->mktclassids) AND
    $this->where
GROUP BY a.modelyear;