2013-07-19 7 views
-2

У меня есть таблица mysql, которая содержит столбец с именем sequence.MySQL Tricky Where Section

Вот мой Постулаты:

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. Мне нужно, чтобы в статусе 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 не имеет последовательность = 0, то он будет иметь последовательность = 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, потому что это повлияет на весь мой запрос.

так что вы можете видеть, что эта модель не имеет последовательность = 0, так что я должен был бы использовать последовательность = 1 возможно содержит 1 или 0 ... Я не уверен, что любая помощь очень ценится Спасибо

+3

Непонятный вопрос. Вы говорите, что последовательность равна 0 или 1, но ваш пример таблицы стилей показывает множество последовательностей, которые не равны 0 или 1, и ни один из них не равен 0. – Barmar

+3

Не могли бы вы разместить более полный пример таблиц ввода и вы надеетесь получить от этого? Возможно, сделайте sqlfiddle. – Barmar

+0

ОП не знает, чего он на самом деле хочет. См. Мой ответ ниже и все комментарии по нему. ОР должен уточнить, что ему нужно, и должен сделать это с помощью http://sqlfiddle.com/ примера базы данных и вывода примера, который пытается достичь, и что это такое, что не дает правильного вывода. последовательность не влияет на то, что ОП заявила, что он нуждается в последнем в комментариях .... – amaster

ответ

1

вы пробовали

... 
AND (a.sequence=0 OR a.sequence=1) 
... 

Я бы присоединяетесь вместо того, чтобы использовать все те, где заявление, а также оптимизировать этот запрос.

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 
       ) 
      ) 

так я просто смотрю, чтобы получить различное modelids из таблицы, но предпочитаемый, что последовательность будет 0 или 1 - OP

SELECT 
    modelid, 
    sequence 
FROM 
    (
     SELECT 
      modelid, 
      sequence 
     FROM 
      styles 
     ORDER BY 
      sequence ASC 
    ) AS sub_query 
GROUP BY 
    modelid 

Thats именно то, что мне нужно. Как я могу добавить это как предложение 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; 

Я не думаю, что это то, что вы хотите, хотя acutally. Вам не нужно это как предложение WHERE, но вам нужно иметь совершенно лучший запрос. Необходимы ли другие таблицы? Что такое$this->whereequate to?

Подумав об этом в течение еще одного часа, я думаю, что это может быть то, что вы на самом деле хотите. Это ограничивает таблицу стилей только один ModelID и сортирует их по самой низкой последовательности, а затем она соединяется с другими таблицами и применяет mktclassid в пункте и пункт $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; 

После этого я сделал и есть больше не давать советы, кроме ЗАКАЗАТЬ Ваш вопрос и ПОЖАЛУЙСТА укажите sqlFiddle и дайте больше примеров ожидаемого результата. Иногда проблема, с которой вы сталкиваетесь, заключается в том, что то, что вы пытаетесь сделать, - это неправильно. Если возможно, всегда указывайте причину, почему вы делаете что-то другое, кроме только моей проблемы ... Другие могут упростить процесс и предоставить решение, которое решает настоящую проблему. Удачи!

+0

, что не работает, потому что большинство триммов имеют последовательность = 1 и последовательность = 0. Есть около 50, которые не имеют sequence = 0, но последовательность = 1.. Если она имеет последовательность = 0, то она имеет последовательность = 1, но не наоборот. – user2506624

+0

@ user2506624, тогда вам нужно будет предоставить более подробную информацию с некоторыми из других таблиц. Как у вас есть одна строка, которая является как последовательностью 0, так и последовательностью 1. Похоже, вам нужен подзапрос – amaster

+0

Я отредактировал свое оригинальное сообщение, чтобы надеяться, уточнить, что я ищу – user2506624