我有一个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
我正试图从这张表中获得一个独特的模型。 我不相信我可以使用DISTINCT,因为它会影响我的整个查询。
所以你可以看到这个模型没有sequence = 0,所以我需要使用sequence = 1 也许一个包含1或0 ...我不确定 任何帮助是极大的赞赏 感谢
答案 0 :(得分:1)
你试过吗
...
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
)
)
所以我只是想从表中获得不同的模型,但是优选序列为0或1 - OP
SELECT
modelid,
sequence
FROM
(
SELECT
modelid,
sequence
FROM
styles
ORDER BY
sequence ASC
) AS sub_query
GROUP BY
modelid
这正是我所需要的。我如何将其作为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
(
SELECT
modelid,
sequence
FROM
styles
ORDER BY
sequence ASC
) AS sub_query
GROUP BY
modelid
)
$this->where
GROUP BY a.modelyear;
其结果与:
相同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->where
等同于什么?
在考虑了这个又一个小时后,我想这可能就是你真正想要的。这会将样式表限制为只有一个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;
在此之后,我已经完成了,除了 CLARIFY 您的问题之外没有其他建议,请提供sqlFiddle并提供更多预期示例输出。有时你遇到的问题是因为你想要做的事情是以错误的方式处理事情。如果可能的话,总是说明你为什么要做的事情,而不仅仅是这里的问题......其他人可能能够简化过程并提供解决实际问题的解决方案。祝你好运!