Регистрирайте се безплатно, за да използвате услугите на сайта! | Вход
Начало Новини ИТ Работа Форум Видео Уроци Скриптове WiFi точки MyLinks Mytech Още


Нова тема
AND или OR
Тази тема е погледната 358 пъти
Добави темата към любими | Принтирай темата | Нова тема 
Публикувано на: 04.09.2008 10:03
ivanov24
Чирак

Мнения: (5)

Здравейте,
от няколко дни се чудя и чета по форуми и документации как да реша следната задача.

Имам Таблица с условно 2 полета.
|integer|float|
|1      |1.2  |
|2      |2.3  |
|3      |4.6  |
|4      |6.6  |
|5      |7.6  |
|6      |8.6  |

Задачата е да изведа редовете които едновременно отговарят на различни условия.
Например: integer=2 и float e между 1 и 3, както и integer=4 и float e между 5 и 6

Пробвах с WHERE (integer=2 AND float BETWEEN 1 AND 3) AND (integer=4 AND float BETWEEN 5 AND 6)
и с
WHERE (integer=2 AND float BETWEEN 1 AND 3) OR (integer=4 AND float BETWEEN 5 AND 6)

Но първото не ми връща резултати, тъй като явно mysql игнорира скобите и няма резултати в които integer=2 и float BETWEEN 5 AND 6 - смесват се условията
С OR почти успях но пък там проблема е че при повече записи ми изкарва и такива редове, които имат само едното условие, а на мен ми трябват и двете да са изпълнени.

Благодаря предварително за отговорите.


 
---------------------------
Потребител от: 04.09.08 | Всички уроци от ivanov24 | Всички скриптове от ivanov24
напиши eMail напиши лично съобщение виж профила на ivanov24
Публикувано на: 04.09.2008 10:15
Mutatos
Император

Администратор

Мнения: (1339)

Здрасти. Пробвай по този начин да видим. Надявма се да съм те разбрал правилно:

CODE
1
2
3
SELECT * FROM xxx
WHERE integer IN (2,4)
 
AND ( (float BETWEEN 1 AND 3) OR (float BETWEEN 5 AND 6) )

Ако не стане пиши пак.

Поздрави!


 
---------------------------
Потребител от: 18.04.04 | Всички уроци от Mutatos | Всички скриптове от Mutatos

Търся за почасова надомна работа преводачи от английски език за превод на материали от IT сферата - новини, уроци ...!
напиши eMail напиши лично съобщение виж профила на Mutatos
Публикувано на: 04.09.2008 11:49
PureEvil
Самурай

Мнения: (1803)

При последната заявка просто ще излезе че при INT 2 и float между 5 и 6 ще даде резултат.

Какъв е проблема с OR? Той ще ти изкара резултати, които отговарят на заданието ти


 
---------------------------
Потребител от: 17.02.05 | Всички уроци от PureEvil | Всички скриптове от PureEvil

Liberate Tu Temet Ex Inferis
напиши eMail напиши лично съобщение виж профила на PureEvil
Публикувано на: 05.09.2008 12:14
ivanov24
Чирак

Мнения: (5)

Явно много съм съкратил примера.
|ID  |SubID  |integer  |float  |
|1   |3      |2        |2.5    |
|2   |3      |2        |3.5    |-да
|3   |3      |2        |3.7    |-да
|4   |3      |2        |4.5    |
|5   |3      |4        |6.5    |
|6   |3      |4        |7.5    |-да
|7   |3      |4        |7.6    |-да
|1   |4      |2        |2.5    |
|2   |4      |2        |3.5    |-да
|3   |4      |2        |3.7    |-да
|4   |4      |2        |4.5    |
|5   |4      |4        |6.5    |
|6   |4      |4        |1.5    |-не
|7   |4      |4        |2.6    |-не
|1   |5      |1        |2.5    |
|2   |5      |1        |3.5    |
|3   |5      |1        |3.7    |
|4   |5      |7        |4.5    |
|5   |5      |8        |4.5    |
|6   |5      |5        |3.5    |
|7   |5      |4        |2.6    |

И ми трябва да изкарам всички СубИД, които имат Интегер=2 и за флоат между 3 и 4, едновременно с което същите да имат имат Интегер=4 и за флоат между 7 и 8

Where (integer=2 AND float between 3 и 4) AND (integer=4 AND float between 7 и 8)

- не връща резултат, защото mysql гледа дали има и Интегер=2, който да е флоат между 7 и 8 и дали има и Интегер=4, който да е флоат между 3 и 4

а

Where (integer=2 AND float between 3 и 4) OR (integer=4 AND float between 7 и 8) - връща и такива редове, които не отговарят и на двете условия. ще върне и SubID  3 и 4, а условието ми е вярно само за SubID  3

дано съм бил по-точен, иначе JOINvam, динамично между 5 и 9 таблици и е много да го постна тука във форума.

Eдинственото решение за което се сещам е UNION по отделно, за всвако от условията, но е доста грубо предвид многото JOINove.


 
Това мнение е редактирано от ivanov24 на 05.09.2008 12:22
---------------------------
Потребител от: 04.09.08 | Всички уроци от ivanov24 | Всички скриптове от ivanov24
напиши eMail напиши лично съобщение виж профила на ivanov24
Публикувано на: 05.09.2008 14:11
zipopro
Шогун

Мнения: (762)

SELECT ... FROM ... WHERE (integer=2 AND float BETWEEN 3 AND 4) OR (integer=4 AND float BETWEEN 7 AND 8)

Така трябва да стане!


 
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
Публикувано на: 05.09.2008 14:58
ivanov24
Чирак

Мнения: (5)

Цитат от zipopro@05.09.2008 14:11:
SELECT ... FROM ... WHERE (integer=2 AND float BETWEEN 3 AND 4) OR (integer=4 AND float BETWEEN 7 AND 8)

Така трябва да стане!

Точно този вариант описвам по-долу в Поста с въпроса си и казвам че така ми вади и СубИД с изпълнено условие в едните скоби, а аз искам и двете да са изпълнени.


 
---------------------------
Потребител от: 04.09.08 | Всички уроци от ivanov24 | Всички скриптове от ivanov24
напиши eMail напиши лично съобщение виж профила на ivanov24
Публикувано на: 05.09.2008 17:29
PureEvil
Самурай

Мнения: (1803)

 Този отговор е маркиран като удовлетворителен!

Кееефиш @zipopro. Другият път да четеш какво се пита поне.

@ivanov24 грешно го правиш просто :).
В момента се сещам за това:
CODE
1
2
3
SELECT t.some_fields FROM table AS t
RIGHT JOIN table AS t2 ON
(t.SubID = t2.SubID AND t.integer <> t2.integer)
WHERE t.integer = 2 AND t.float BETWEEN 1 AND 3 AND t2.integer = 4 AND t2.float BETWEEN 6 AND 7
Макар че идва прекалено сложно. Може и с UNION да си поиграеш и би трябвало да се получи.


 
Това мнение е редактирано от PureEvil на 05.09.2008 17:31
---------------------------
Потребител от: 17.02.05 | Всички уроци от PureEvil | Всички скриптове от PureEvil

Liberate Tu Temet Ex Inferis
напиши eMail напиши лично съобщение виж профила на PureEvil
Публикувано на: 11.09.2008 10:01
ivanov24
Чирак

Мнения: (5)

@PureEvil ако имам още едно условие така ли ще стане?

CODE
1
2
3
4
SELECT t.some_fields FROM table AS t
RIGHT JOIN table AS t2 ON
(t.SubID = t2.SubID AND t.integer <> t2.integer)
RIGHT JOIN table AS t3 ON (t2.SubID = t3.SubID AND t2.integer <> t3.integer)
WHERE t.integer = 2 AND t.float BETWEEN 1 AND 3 AND t2.integer = 4 AND t2.float BETWEEN 6 AND 7 AND t3.integer = 5 AND t3.float BETWEEN 8 AND 9

С UNION пробвах, но ми връща същите резултати като с OR


 
---------------------------
Потребител от: 04.09.08 | Всички уроци от ivanov24 | Всички скриптове от ivanov24
напиши eMail напиши лично съобщение виж профила на ivanov24
Публикувано на: 11.09.2008 11:11
PureEvil
Самурай

Мнения: (1803)

Слагай един EXPLAIN пред заявките и виж как се държат реално.
Иначе би трябвало да се получи: пробвай, тествай, чети и нещата ще станат ;).


 
---------------------------
Потребител от: 17.02.05 | Всички уроци от PureEvil | Всички скриптове от PureEvil

Liberate Tu Temet Ex Inferis
напиши eMail напиши лично съобщение виж профила на PureEvil
Публикувано на: 11.09.2008 15:56
ivanov24
Чирак

Мнения: (5)

Пробвах - Работи.

Благодаря за съветите.


 
---------------------------
Потребител от: 04.09.08 | Всички уроци от ivanov24 | Всички скриптове от ivanov24
напиши eMail напиши лично съобщение виж профила на ivanov24
Публикувано на: 16.09.2008 01:30
Vikito
Калфа

Мнения: (12)

О, ivanov24, кефиш ме.
 
И ми трябва да изкарам всички СубИД, които имат Интегер=2 и за флоат между 3 и 4, едновременно с което същите да имат имат Интегер=4 и за флоат между 7 и 8

Where (integer=2 AND float between 3 и 4) AND (integer=4 AND float between 7 и 8)

- не връща резултат, защото mysql гледа дали има и Интегер=2, който да е флоат между 7 и 8 и дали има и Интегер=4, който да е флоат между 3 и 4
Според теб съществува ли запис и може ли да съществува, при който integer  да е едновременно равен на 2 и на 4? Защото точно това караш да търси. Where (integer=2 AND float between 3 и 4) AND (integer=4 AND float between 7 и 8)
Тази заявка много ясно, че нищо няма да връща. Със OR ще върне резултат:
Where (integer=2 AND float between 3 и 4) OR (integer=4 AND float between 7 и 8).
Видях, че си решил проблема, но ти казвам за в бъдеще, че такава заявка(тази с AND, която си написал) не е коректна.


 
---------------------------
Потребител от: 13.12.07 | Всички уроци от Vikito | Всички скриптове от Vikito
напиши eMail напиши лично съобщение виж профила на Vikito
 1 посетител чете тази тема (0 потребители и 1 гост)  
Активни потребители: ---
   




mytech.bg © 2004 - 2009 | Контакти | За реклама