Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объединить логику
 
 автор: winflip   (17.06.2009 в 19:24)   письмо автору
 
 

Как сделать, чтобы в одном запросе объединялось два следующих:
SELECT * FROM tbl WHERE field1=param1 AND field2=param2

SELECT * FROM tbl WHERE field1=param1 OR field2=param2
.
Причем две одинаковые строки не должны быть в выборке и строки с логикой И должны быть выше чем строки с логикой ИЛИ. Надеюсь, что вы поняли суть вопроса:)

  Ответить  
 
 автор: Trianon   (17.06.2009 в 19:51)   письмо автору
 
   для: winflip   (17.06.2009 в 19:24)
 

Касательно условия WHERE :

a&b | a|b  == a|b 



Что до порядка строк, то очевидно в параметр сортировки нужно поставить a&b

Надеюсь, Вы поняли суть ответа.

  Ответить  
 
 автор: winflip   (17.06.2009 в 20:05)   письмо автору
 
   для: Trianon   (17.06.2009 в 19:51)
 

Почти работает. Только знак равенства поменял на один. А вот сортировка не работает как надо.

  Ответить  
 
 автор: Trianon   (17.06.2009 в 20:18)   письмо автору
 
   для: winflip   (17.06.2009 в 20:05)
 

Я никакой знак равенства в виду не имел.

  Ответить  
 
 автор: winflip   (17.06.2009 в 20:20)   письмо автору
 
   для: 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

  Ответить  
 
 автор: winflip   (17.06.2009 в 20:25)   письмо автору
 
   для: 32423423   (17.06.2009 в 20:21)
 

Как не меняет? Было два поля стало одно. И что значат знаки собаки?

  Ответить  
 
 автор: 23423   (17.06.2009 в 20:27)
 
   для: winflip   (17.06.2009 в 20:25)
 

Как не меняет? Было два поля стало одно

По-вашему, что-то, кроме названия поля изменится? Расскажите.

И что значат знаки собаки?

Почитайте мануал.

  Ответить  
 
 автор: winflip   (17.06.2009 в 20:44)   письмо автору
 
   для: 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)
 

У меня всё нормально, т.е. выводит сначала строки где присутствует и "авва" и "мы" одновременно, а затем те, где что-то одно.

  Ответить  
 
 автор: winflip   (17.06.2009 в 20:58)   письмо автору
35.6 Кб
 
   для: 234124   (17.06.2009 в 20:49)
 

Смотри аттач

  Ответить  
 
 автор: winflip   (17.06.2009 в 21:30)   письмо автору
 
   для: 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 '%мы%')


...

  Ответить  
 
 автор: winflip   (17.06.2009 в 22:33)   письмо автору
 
   для: 23423   (17.06.2009 в 22:04)
 

Спасибо огромное. Сам бы не додумался такое написать.:)

  Ответить  
 
 автор: winflip   (17.06.2009 в 22:39)   письмо автору
 
   для: 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);

}
?>

  Ответить  
 
 автор: Trianon   (18.06.2009 в 00:55)   письмо автору
 
   для: 234234   (18.06.2009 в 00:10)
 

XOR над тремя и более аргументами приводит к потере логики.

Её, правда, и в формулировке "тройного запроса" не больно много-то оставалось, но тем не менее, уподобляться оппоненту не стоило.

  Ответить  
 
 автор: 5645   (18.06.2009 в 01:07)
 
   для: Trianon   (18.06.2009 в 00:55)
 

Да, получилась чушь.

  Ответить  
 
 автор: winflip   (18.06.2009 в 09:45)   письмо автору
 
   для: Trianon   (18.06.2009 в 00:55)
 

А что Вы можете посоветовать?

  Ответить  
 
 автор: Trianon   (18.06.2009 в 09:58)   письмо автору
 
   для: winflip   (18.06.2009 в 09:45)
 

посоветую задать вопрос более корректно.

  Ответить  
 
 автор: winflip   (18.06.2009 в 10:18)   письмо автору
 
   для: 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%')
?

  Ответить  
 
 автор: Trianon   (18.06.2009 в 10:29)   письмо автору
 
   для: winflip   (18.06.2009 в 10:18)
 

При чем здесь первый запрос?
В каком порядке Вы хотите получать строки?
Почему Вы полагаете что в запросах можно просто менять одни части на другие, и всё будент пахать?

  Ответить  
 
 автор: winflip   (18.06.2009 в 10:40)   письмо автору
 
   для: Trianon   (18.06.2009 в 10:29)
 

Я разве сказал что это должно пахать. Я просто спрашиваю как можно написать работающий запрос такого типа. Порядок.
1) строки где истинны все 3 условия
2) строки где 2 условия истинны
3) строки где хотя бы одно условие истинно. Условия заданы в форме LIKE

  Ответить  
 
 автор: winflip   (18.06.2009 в 12:02)   письмо автору
 
   для: winflip   (18.06.2009 в 10:40)
 

В общем надо сделать запрос на поиск трех слов в поле shot. Необходимо чтобы хотя бы одно слово присутствовало в строке. Поиск сделать лайком. И отсортировать: чем больше слов совпадает тем строка выше. Вот собственно и все.

  Ответить  
 
 автор: Trianon   (18.06.2009 в 15:34)   письмо автору
 
   для: winflip   (18.06.2009 в 12:02)
 

чем больше слов совпадает это не то же самое, что и чем больше условий выполняется.
Общее впечатление такое, что Вам нужен полнотекстовый поиск.
А это совсем другое.

  Ответить  
 
 автор: Trianon   (18.06.2009 в 15:32)   письмо автору
 
   для: winflip   (18.06.2009 в 10:40)
 

WHERE a | b | с
ORDER BY (a) + (b) + (c) DESC

  Ответить  
 
 автор: winflip   (18.06.2009 в 16:10)   письмо автору
 
   для: Trianon   (18.06.2009 в 15:32)
 

Спасибо. Просто я ступил. Теперь буду корректнее ставить проблему.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования