Сложный MySQL SELECT - PullRequest
       3

Сложный MySQL SELECT

0 голосов
/ 03 февраля 2012

У меня есть таблица MySQL (tbl_filters) с 3 столбцами: id, cat, val

id & val - числовые значения, cat - varchar. Для каждого идентификатора есть несколько строк.

У меня также есть другая таблица (tbl_info) с несколькими столбцами, включая id, что соответствует id из tbl_filters. Есть столбец с именем name, который я ищу.

Я хотел бы выбрать имя всех строк, которые соответствуют установленному значению для cat, но только если val для cat является максимальным для этого идентификатора, и только если оно выше минимального набор val.

В псевдокоде это будет что-то вроде:

SELECT tbl_info.name FROM tbl_info,tbl_filters
WHERE (tbl_info.id=tbl_filters.id) AND (cat="mycat") AND (val>=0.3)
AND (there are no other rows for this id in tbl_info with a higher value for val)

Пример: * * тысяча двадцать-восемь

tbl_filters
id,cat,val
1 eg1 0.43
1 eg2 0.60
1 eg3 0.78

tbl_info
id name
1 MyName

В приведенном выше примере значение должно быть возвращено только в том случае, если я ищу cat с именем eg3, поскольку оно имеет наибольшее значение. Для других кошек ничего не должно быть возвращено, так как они не имеют наибольшего значения.

Другим вариантом будет сделать столбец в tbl_info только для кошки с наибольшим значением, но это грязное решение, которое я бы предпочел избегать.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Я думаю, что я следую за вами ... Запрос INNER-MOST предварительно квалифицирует HIGHEST Value для идентификатора вашей квалификации минимального значения и категорию, к которой он относится.Как только вы получите этот список, снова присоединитесь, чтобы получить имя из tbl_info.Я повторно присоединился к tbl_filters во второй раз, если на этой записи были другие элементы, которые вы хотите, такие как дата курса или другие вещи.Если вам это НЕ нужно, вы можете игнорировать второе соединение "tf2" и просто изменить список полей с tf2.val на PreQualified.HighestQualVal.

select
      ti.id,
      ti.name,
      tf2.val
   from
      ( select 
              tf.id,
              max( tf.val ) as HighestQualVal
           from
              tbl_filters tf
           where
                  tf.cat = "mycat"
              and tf.val >= 0.3
      ) PreQualified

      JOIN tbl_info ti
         on PreQualified.id = ti.id

      JOIN tbl_filters tf2
         on PreQualified.id = tf2.id
         AND PreQualified.HighestQualVal = tf2.val
0 голосов
/ 03 февраля 2012

Как насчет?

select ti.name, MaxId.maxVal from
    (select tf1.id, tf1.cat, max(tf1.val) as maxVal from tbl_filters1 tf1
    where tf1.cat = 'eg3' and tf1.val >= 0.0
    group by tf1.id, tf1.cat) MaxCat
inner join (
    select tf2.id, max(tf2.val) as maxVal from tbl_filters2 tf2
    group by tf2.id) MaxId
on (MaxCat.id = MaxId.id and MaxCat.maxVal = MaxId.maxVal)
inner join tbl_info ti on MaxId.id = ti.id

Пример здесь

В принципе, и если я не ошибаюсь (снова), я получаю все максимальное значениеза каждую пару id и cat.Затем получите максимальное значение для каждого идентификатора.Если оба совпадают, то есть, если максимум для кошки такой же, как максимум для всего идентификатора, тогда я возвращаю результаты.

Не стесняйтесь поправлять меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...