|
|
|
| Как сделать, чтобы в одном запросе объединялось два следующих:
SELECT * FROM tbl WHERE field1=param1 AND field2=param2
|
SELECT * FROM tbl WHERE field1=param1 OR field2=param2
| .
Причем две одинаковые строки не должны быть в выборке и строки с логикой И должны быть выше чем строки с логикой ИЛИ. Надеюсь, что вы поняли суть вопроса:) | |
|
|
|
|
|
|
|
для: winflip
(17.06.2009 в 19:24)
| | Касательно условия WHERE :
Что до порядка строк, то очевидно в параметр сортировки нужно поставить a&b
Надеюсь, Вы поняли суть ответа. | |
|
|
|
|
|
|
|
для: Trianon
(17.06.2009 в 19:51)
| | Почти работает. Только знак равенства поменял на один. А вот сортировка не работает как надо. | |
|
|
|
|
|
|
|
для: winflip
(17.06.2009 в 20:05)
| | Я никакой знак равенства в виду не имел. | |
|
|
|
|
|
|
|
для: winflip
(17.06.2009 в 20:05)
| | Не так написал. Вот два запроса которые надо объединить
SELECT * FROM tbl WHERE field1 LIKE '%param1%' AND field1 LIKE '%param2%'
|
SELECT * FROM tbl WHERE field1 LIKE '%param1%' OR field1= LIKE '%param1%'
|
Во первых поставил полей не два, а одно, ну и поставил LIKE | |
|
|
|
|
автор: 234234 (17.06.2009 в 20:22) |
|
|
для: winflip
(17.06.2009 в 20:20)
| | Не так написал
Это ничего не меняет | |
|
|
|
|
автор: 32423423 (17.06.2009 в 20:21) |
|
|
для: winflip
(17.06.2009 в 20:05)
| | Почти работает. Только знак равенства поменял на один
:)))))))))
SELECT * FROM tbl WHERE (@c1 := field1 =param1) OR (@c2 := field2 =param2) ORDER BY @c1 XOR @c2 | |
|
|
|
|
|
|
|
для: 32423423
(17.06.2009 в 20:21)
| | Как не меняет? Было два поля стало одно. И что значат знаки собаки? | |
|
|
|
|
автор: 23423 (17.06.2009 в 20:27) |
|
|
для: winflip
(17.06.2009 в 20:25)
| | Как не меняет? Было два поля стало одно
По-вашему, что-то, кроме названия поля изменится? Расскажите.
И что значат знаки собаки?
Почитайте мануал. | |
|
|
|
|
|
|
|
для: 23423
(17.06.2009 в 20:27)
| | >Почитайте мануал.
Его бы найти на русском нормальный
Вот этот запрос:
SELECT * FROM sites WHERE(@c1:=shot LIKE '%авва%') OR (@c2:=shot LIKE '%мы%') ORDER BY @c1 XOR @c2
| Выводит результат нормально, но выводит сначала с логикой ИЛИ, причём DESC не помогает | |
|
|
|
|
автор: 234124 (17.06.2009 в 20:49) |
|
|
для: winflip
(17.06.2009 в 20:44)
| | У меня всё нормально, т.е. выводит сначала строки где присутствует и "авва" и "мы" одновременно, а затем те, где что-то одно. | |
|
|
|
|
 35.6 Кб |
|
|
для: 234124
(17.06.2009 в 20:49)
| | Смотри аттач | |
|
|
|
|
|
|
|
для: winflip
(17.06.2009 в 20:58)
| | есть какой нибудь выход? | |
|
|
|
|
автор: 23423 (17.06.2009 в 22:04) |
|
|
для: winflip
(17.06.2009 в 21:30)
| |
SELECT * FROM sites WHERE (shot LIKE '%авва%') OR (shot LIKE '%мы%') ORDER BY (shot LIKE '%авва%') XOR (shot LIKE '%мы%')
|
... | |
|
|
|
|
|
|
|
для: 23423
(17.06.2009 в 22:04)
| | Спасибо огромное. Сам бы не додумался такое написать.:) | |
|
|
|
|
|
|
|
для: winflip
(17.06.2009 в 22:33)
| | Хм. А как будет выглядеть тройной запрос? | |
|
|
|
|
автор: 234234 (18.06.2009 в 00:10) |
|
|
для: winflip
(17.06.2009 в 22:39)
| |
<?php
function esc_like($s)
{
return addcslashes($s, '%_\\');
}
$a = array();
$a[]= 'слово1';
$a[]= 'слово2';
$a[]= 'слово3';
for($i=0;$i<count($a);$i++)
$a[$i]="(shot LIKE '%" . mysql_escape_string(esc_like($a[$i])) . "%')";
if( !empty($a) ) {
$sql = "SELECT * FROM sites WHERE ". implode($a, ' OR ') ." ORDER BY ". implode($a, ' XOR ') ."";
echo htmlspecialchars($sql);
}
?>
|
| |
|
|
|
|
|
|
|
для: 234234
(18.06.2009 в 00:10)
| | XOR над тремя и более аргументами приводит к потере логики.
Её, правда, и в формулировке "тройного запроса" не больно много-то оставалось, но тем не менее, уподобляться оппоненту не стоило. | |
|
|
|
|
автор: 5645 (18.06.2009 в 01:07) |
|
|
для: Trianon
(18.06.2009 в 00:55)
| | Да, получилась чушь. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2009 в 00:55)
| | А что Вы можете посоветовать? | |
|
|
|
|
|
|
|
для: winflip
(18.06.2009 в 09:45)
| | посоветую задать вопрос более корректно. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2009 в 09:58)
| |
SELECT * FROM sites WHERE (shot LIKE '%авва%') OR (shot LIKE '%мы%') ORDER BY (shot LIKE '%авва%') XOR (shot LIKE '%мы%')
|
Этот запрос возвращает результат то, что надо. Но мне необходимо ещё сделать запрос что-то вроде
SELECT * FROM sites WHERE (shot LIKE '%авва%') OR (shot LIKE '%мы%') OR (shot LIKE '%слово3%') ORDER BY (shot LIKE '%авва%') XOR (shot LIKE '%мы%') XOR (shot LIKE '%слово3%')
|
Я сперва так и сделал, но как Вы уже говорили два раза употреблять XOR нельзя, действительно сортировка не работает. Каким аналогом можно заменить
ORDER BY (shot LIKE '%авва%') XOR (shot LIKE '%мы%') XOR (shot LIKE '%слово3%')
| ? | |
|
|
|
|
|
|
|
для: winflip
(18.06.2009 в 10:18)
| | При чем здесь первый запрос?
В каком порядке Вы хотите получать строки?
Почему Вы полагаете что в запросах можно просто менять одни части на другие, и всё будент пахать? | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2009 в 10:29)
| | Я разве сказал что это должно пахать. Я просто спрашиваю как можно написать работающий запрос такого типа. Порядок.
1) строки где истинны все 3 условия
2) строки где 2 условия истинны
3) строки где хотя бы одно условие истинно. Условия заданы в форме LIKE | |
|
|
|
|
|
|
|
для: winflip
(18.06.2009 в 10:40)
| | В общем надо сделать запрос на поиск трех слов в поле shot. Необходимо чтобы хотя бы одно слово присутствовало в строке. Поиск сделать лайком. И отсортировать: чем больше слов совпадает тем строка выше. Вот собственно и все. | |
|
|
|
|
|
|
|
для: winflip
(18.06.2009 в 12:02)
| | чем больше слов совпадает это не то же самое, что и чем больше условий выполняется.
Общее впечатление такое, что Вам нужен полнотекстовый поиск.
А это совсем другое. | |
|
|
|
|
|
|
|
для: winflip
(18.06.2009 в 10:40)
| | WHERE a | b | с
ORDER BY (a) + (b) + (c) DESC | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2009 в 15:32)
| | Спасибо. Просто я ступил. Теперь буду корректнее ставить проблему. | |
|
|
|