[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MYSQL вопрос
mavrrr
есть данные в mysql:

id fild1
1 5
1 6
1 4
1 2
2 4
2 5
2 6
3 5
4 6
5 2
6 5

нужно выбрать ID у которых fild1 равно и 5 и 6

после выполнения запроса должно получиться:
1
2

голову сломал но сделать не могу, прошу помощи



Спустя 2 минуты, 15 секунд (15.05.2011 - 20:39) sharki написал(а):
mavrrr
Показывай свой вариант

Спустя 19 минут, 38 секунд (15.05.2011 - 20:59) Winston написал(а):
mavrrr
Учи SQL. У меня в подписи по ссылочке пройди.
Цитата (mavrrr @ 15.05.2011 - 19:37)
голову сломал но сделать не могу, прошу помощи

Мне кажется там нужно что-то с чем-то сравнить чтобы получить нужное.
И как id может быть одинаковой blink.gif Ведь для того оно и ID чтобы быть уникальным

Спустя 3 минуты, 6 секунд (15.05.2011 - 21:02) alex12060 написал(а):
Прочитай про DISTINCT (DISTINCTROW), про IN и LIMIT и попробуй сделать сам.

Спустя 2 минуты, 13 секунд (15.05.2011 - 21:04) sharki написал(а):
alex12060
Зачем подсказал) Теперь он вообще не будет ничего искать, и пробовать, если вообще пробовал) А так если бы он показал, то помогли бы)

Спустя 2 минуты, 55 секунд (15.05.2011 - 21:07) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 18:02)
Прочитай про DISTINCT (DISTINCTROW), про IN и LIMIT и попробуй сделать сам.

с IN я пробовал, не то.. с LIMIT конечно тоже ничего не получится... сейчас DISTINCT попробую... на счет уникальности ID, ID в некоторых случаях может быть не уникальным, например в моем..

Спустя 1 минута, 15 секунд (15.05.2011 - 21:08) mavrrr написал(а):
Цитата (sharki @ 15.05.2011 - 18:04)
alex12060
Зачем подсказал) Теперь он вообще не будет ничего искать, и пробовать, если вообще пробовал) А так если бы он показал, то помогли бы)

откуда такие выводы не пойму

Спустя 1 минута, 5 секунд (15.05.2011 - 21:09) sharki написал(а):
mavrrr
Если это не так, то извини, просто ОЧЕНЬ часто просят написать за них, под такими вопросами.

Спустя 40 секунд (15.05.2011 - 21:10) alex12060 написал(а):
mavrrr

Цитата
alex12060
Зачем подсказал) Теперь он вообще не будет ничего искать, и пробовать, если вообще пробовал) А так если бы он показал, то помогли бы)


Это давно пройденная практика. Так всегда было, есть и будет.

sharki

Да, надо было подождать, ну что-ж поделать, помогу уж)


Спустя 2 минуты, 31 секунда (15.05.2011 - 21:13) Winston написал(а):
Цитата (mavrrr @ 15.05.2011 - 20:07)
с IN я пробовал, не то.. с LIMIT

Зачем это? Там только сравнить, и вывести уникальные

Спустя 1 минута, 3 секунды (15.05.2011 - 21:14) mavrrr написал(а):
distinct к сожалению тоже мало чем поможет sad.gif

Спустя 1 минута, 56 секунд (15.05.2011 - 21:16) Winston написал(а):
Покажи как пробуешь

Спустя 2 минуты, 24 секунды (15.05.2011 - 21:18) mavrrr написал(а):
Цитата (PHPprogramer @ 15.05.2011 - 18:13)
Цитата (mavrrr @ 15.05.2011 - 20:07)
с IN я пробовал, не то.. с LIMIT

Зачем это? Там только сравнить, и вывести уникальные

дело не в уникальности, а в том что нужно выбрать элементы у которых field1 равно одновременно и 5 и 6

Спустя 1 минута (15.05.2011 - 21:19) Winston написал(а):
Цитата (mavrrr @ 15.05.2011 - 19:37)
голову сломал но сделать не могу

А ты что-то пробовал ?
Цитата (PHPprogramer @ 15.05.2011 - 20:16)
Покажи как пробуешь


Спустя 4 минуты, 51 секунда (15.05.2011 - 21:24) mavrrr написал(а):
Цитата (PHPprogramer @ 15.05.2011 - 18:16)
Покажи как пробуешь

я не могу придумать запрос

если мы сделаем так:

select * from table where field in (5,6)

то я получу id у которых id=5 или id=6, в нашем случаи это:
1
1
2
2
3
4
6

а мне нужно условие id=5 и id=6


Спустя 1 минута, 48 секунд (15.05.2011 - 21:26) alex12060 написал(а):
Я состряпал запрос. Сделал таблицу. Все вывелось правильно по твоему вопросу:
нужно выбрать ID у которых fild1 равно и 5 и 6

Итог, он выбрал это:

id fild1
1 5
1 6
1 4
1 2
2 4
2 5
2 6
3 5
4 6
5 2
6 5

Но как ты хочешь получить только первые 2? Я не понимаю...

Спустя 2 минуты, 48 секунд (15.05.2011 - 21:28) Winston написал(а):
Тебе нужно выбрать уникальные значения

Спустя 1 минута, 54 секунды (15.05.2011 - 21:30) sharki написал(а):
SELECT DISTINCT * 
FROM `table`
WHERE `field` =5
AND `field` = 6

А так?

Спустя 30 секунд (15.05.2011 - 21:31) alex12060 написал(а):
В общем, вывода, который ожидает ТС я добился. Но условие и результат у него как небо и земля.

Спустя 1 минута, 49 секунд (15.05.2011 - 21:33) sharki написал(а):
Что-то я щас вчитываюсь, и понимаю что это бред О_О

Это надо получить все данные, а потом пройтись циклом по полученным данным, и если field >= 2 то забрать значение, если нет то пропустить итерацию

Спустя 1 минута, 2 секунды (15.05.2011 - 21:34) inpost написал(а):
SELECT *
FROM `table`
WHERE `id` = (
SELECT `id`
FROM `table`
WHERE `field` = 6
) AND `field` = 5

Что-то вроде этого.

Спустя 21 секунда (15.05.2011 - 21:34) alex12060 написал(а):
SELECT `id` , `fild1`
FROM `t`
WHERE `fild1`
IN ( 5, 6 )
AND `id` = 1

Спустя 6 минут, 2 секунды (15.05.2011 - 21:40) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 18:26)
Я состряпал запрос. Сделал таблицу. Все вывелось правильно по твоему вопросу:
нужно выбрать ID у которых fild1 равно и 5 и 6

Итог, он выбрал это:

id fild1
1 5
1 6
1 4
1 2
2 4
2 5
2 6
3 5
4 6
5 2
6 5

Но как ты хочешь получить только первые 2? Я не понимаю...

ты не понял логику, я хочу выбрать id которые одновременно принадлежать 5 и 6, чтобы было понятнее я придумаю образ, в библиотеке есть книги под номерами ID (1,2,3,4,5,6), у каждой книги есть свойства field (1-старая, 2-испорченная, 3-тонкая, 4-толстая, 5-новая, 6-детская, 7-взрослая).. декан поставил задачу выбрать новые детские книги.. только новые ему не нужны! и только детские ему не нужны! ему нужны толстые детские книги!

Спустя 1 минута, 6 секунд (15.05.2011 - 21:41) sharki написал(а):
mavrrr
Ну так у тебя тогда структура БД неправильная в итоге.

Спустя 3 секунды (15.05.2011 - 21:41) inpost написал(а):
Может в моём примере надо id IN ставить, либо отдельно через 2 запроса, а не через один.
В первом взять с `field` = 5, во втором с `field` = 6

Спустя 1 минута, 47 секунд (15.05.2011 - 21:43) alex12060 написал(а):
id fild1
1 5
1 6

1 4
1 2
2 4
2 5
2 6

3 5
4 6
5 2
6 5

Такой должен быть тогда результат.

Спустя 46 секунд (15.05.2011 - 21:44) mavrrr написал(а):
Цитата (inpost @ 15.05.2011 - 18:41)
Может в моём примере надо id IN ставить, либо отдельно через 2 запроса, а не через один.
В первом взять с `field` = 5, во втором с `field` = 6

да скорее всего тут нужно в 2 запроса.. но как, не знаю, на oracle я бы решил все через триггеры или вью, в mysql такого нет

Спустя 1 минута, 30 секунд (15.05.2011 - 21:45) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 18:43)
id fild1
1 5
1 6

1 4
1 2
2 4
2 5
2 6

3 5
4 6
5 2
6 5

Такой должен быть тогда результат.

да такой бы меня устроил

Спустя 13 минут, 40 секунд (15.05.2011 - 21:59) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 18:56)
#POST# t=45113<br />Я ужэ сонный, но тут вот работает. Не знаю, полюбому есть вариант оптимальней...


SELECT`id`, `fild1`
FROM `t`
WHERE `fild1`
IN ( 5, 6 )
AND `id` IN ( 1, 2 )

ты подумай сам что ты пишешь, я не знаю про ID 1 и 2, я знаю только про FILD 5,6. и хочу в итоге получить ID 1 и 2 - как я могу использовать это в запросе?

Спустя 2 минуты, 35 секунд (15.05.2011 - 22:02) alex12060 написал(а):
SELECT `id` , `fild1`
FROM `t`
WHERE `fild1`
IN ( 5, 6 )
AND id = (
SELECT @next := id
FROM t
WHERE id >0
ORDER BY id ASC
LIMIT
0 , 1 )

Спустя 8 минут, 18 секунд (15.05.2011 - 22:10) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 19:02)
SELECT `id` , `fild1`
FROM `t`
WHERE `fild1`
IN ( 5, 6 )
AND id = (
SELECT @next := id
FROM t
WHERE id >0
ORDER BY id ASC
LIMIT
0 , 1 )

не пойму логику

Спустя 2 минуты, 15 секунд (15.05.2011 - 22:12) alex12060 написал(а):
Выбираем значения, где fild1 имеет только 5 и 6, и где id равен следующему после него id

Спустя 5 минут, 7 секунд (15.05.2011 - 22:17) mavrrr написал(а):
Цитата (alex12060 @ 15.05.2011 - 19:12)
Выбираем значения, где fild1 имеет только 5 и 6, и где id равен следующему после него id

а почему именно следующему? в моей таблице чуть больше 50тысяч элементов, и все они разные, мала вероятность что они будут следующими

Спустя 4 минуты, 41 секунда (15.05.2011 - 22:22) alex12060 написал(а):
Он выбрал, допустим, это:

1 5
2 6
1 5
1 6
3 5
2 6
5 5
5 6
4 5
4 6
1 5
2 6

В итоге, по условию, должно выбраться:

1 5
1 6
5 5
5 6
4 5
4 6

Но я вижу, что мой запрос пока не алле. Ладно, я спать пожалуй. Завтра еще подумаю.

Спустя 2 минуты, 4 секунды (15.05.2011 - 22:24) mavrrr написал(а):
короче сам вроде допер, получилось вот так:

select DISTINCT id from t where id in (select id from t where field=5) and id in (select id from t where field=6)

не уверен что это правильное решение, будет работать не быстро... sad.gif

Спустя 4 минуты, 29 секунд (15.05.2011 - 22:28) mavrrr написал(а):
сейчас проверил на больших данных работает правильно, но с учетом того что этот запрос сам является подзапросом, то все явно не летает... есть у кого-нибудь мысли как это оптимизировать? может в mysql есть какие-нибудь механизмы для этого?

Спустя 19 минут, 1 секунда (15.05.2011 - 22:47) inpost написал(а):
mavrrr
Второй подзапрос лишний, там достаточно AND `field` = 6 , как я писал ранее.

Спустя 28 минут, 26 секунд (15.05.2011 - 23:16) mavrrr написал(а):
Цитата (inpost @ 15.05.2011 - 19:47)
mavrrr
Второй подзапрос лишний, там достаточно AND `field` = 6 , как я писал ранее.

да согласен, так будет оптимальнее, жаль что из-за флуда не внимательно прочитал твой запрос, тема закрылась гораздо бы быстрее, всем спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.