Проверка на существование в выборке...

boddicheg
Дата: 28.01.2013 11:04:33
Здравствуйте, обитатели этого форума!
Создать эту тему меня заставила вот такая проблемма.
Мне нужно проверить, входит ли строка (row) с определенным индексом в множество другой выборки, то есть:
мой запрос на выборку
SELECT 
                    jokes.jokeId,jokes.jokeText,jokes.jokeLikes,
                    jokesInfo.dateOfInsert,jokes.jokeDislikes,
                    (select count(*) from `jokes` where exists( select * from `jokes` ORDER BY  `jokeLikes` DESC  limit 10)) countInTop,
                    FROM  `jokes` , `jokesInfo`
                    WHERE
                    jokes.jokeId = jokesInfo.jokeId
                    ORDER BY  `jokeId` DESC 
                    LIMIT 100

вся проблемма в 4 строчке. На просторах сети я прочитал, что нужно использовать EXISTS. Но результат не тот, что нужно.
Прошу помочь.

PS: другими словами, мне нужно проверить, входит ли пост(joke) в топ 10 постов. Топ строится по рейтингу(jokeLikes)
Akina
Дата: 28.01.2013 11:16:56
boddicheg
На просторах сети я прочитал, что нужно использовать EXISTS. Но результат не тот, что нужно.
Само собой.
Твой where exists просто проверяет, возвращает ли хотя бы одну запись подзапрос select * from `jokes` ORDER BY `jokeLikes` DESC limit 10.
boddicheg
Дата: 28.01.2013 11:29:35
Вот. Это я позже увидел, когда оно возращало количество всех записей в таблице
AlexeyVD
Дата: 28.01.2013 11:29:57
boddicheg,

Вам нужно что-то вроде этого.
SELECT j.jokeId,
       IF(sel.jokeId IS NULL, 'Не входит в топ 10', 'Входит в топ 10')
  FROM jokes j
  JOIN jokesInfo i ON j.jokeId = i.jokeId
  LEFT JOIN
  (
     SELECT jokeId, jokeLikes
       FROM joke
       ORDER BY jokeLikes DESC
       LIMIT 10
  ) sel ON j.jokeId = sel.jokeId
...
boddicheg
Дата: 28.01.2013 11:36:22
AlexeyVD
boddicheg,

Вам нужно что-то вроде этого.
SELECT j.jokeId,
       IF(sel.jokeId IS NULL, 'Не входит в топ 10', 'Входит в топ 10')
  FROM jokes j
  JOIN jokesInfo i ON j.jokeId = i.jokeId
  LEFT JOIN
  (
     SELECT jokeId, jokeLikes
       FROM joke
       ORDER BY jokeLikes DESC
       LIMIT 10
  ) sel ON j.jokeId = sel.jokeId
...


я конечно мало что понимаю, и у меня явно не хватает скилла, но jokeId - это автоинкрементное поле, и оно никогда вроде не бывет NULL
tanglir
Дата: 28.01.2013 11:38:10
boddicheg
но jokeId - это автоинкрементное поле, и оно никогда вроде не бывет NULL
В том и смысл. Это же левый джойн.
boddicheg
Дата: 28.01.2013 11:42:44
Хорошо. Я попробую разобратся)
boddicheg
Дата: 28.01.2013 11:49:29
Реально!! Большое спасибо! А еще вопрос : можно ли обозначить if как переменную)
boddicheg
Дата: 28.01.2013 11:57:07
boddicheg
Реально!! Большое спасибо! А еще вопрос : можно ли обозначить if как переменную)


я понял что за бред написал) Извиняюсь. Просто теперь этот if и все что в скобках - это название столбца)
AlexeyVD
Дата: 28.01.2013 11:58:26
...
IF(sel.jokeId IS NULL, 'Не входит в топ 10', 'Входит в топ 10') AS inTop10
...