Помощник
|
Как сделать условие в sql запросе? |
Wins
|
Сообщение
#1
|
||
|
|
||
|
|||
Webmaster_hb |
9.1.2014, 10:40;
Ответить: Webmaster_hb
Сообщение
#2
|
|
а зачем ???
выбирайте все данные через LEFT JOIN и потом работайте с полученными данными |
|
|
Wins
|
Сообщение
#3
|
|
а зачем ??? выбирайте все данные через LEFT JOIN и потом работайте с полученными данными Так мне не надо все данные, или я опять что то не понимаю. Есть инпуты и чекбоксы, для поиска по фильтрам, они могут быть как заполненными так и нет. Если инпут пустой, или чекбокс не выбран то по этим полям искать не нужно. Я не много не так написал, там будет переменная в которой значение полученное из POSTa, например так: [PHP]$price = trim($_POST['price']);[/PHP] JOIN `optional` `t6` on `t2`.`price`= "$price" Но если допустим чекбокс под именем price не был выбран, его значение равно нулю, а поиск нужно делать поэтому полю только если $price==1. Получается если $price==0, то нужно выбрать все записи где поле price=0 и 1, если $price==1, то выбрать только поля где price=1, а поля с значением 0 не извлекать. |
|
|
Wins
|
Сообщение
#4
|
|
О до меня кажись дошло как это делается на php, буду пробывать.
|
|
|
Webmaster_hb |
9.1.2014, 15:03;
Ответить: Webmaster_hb
Сообщение
#5
|
|
тогда проще формировать разные SQL запросы
т.е. в логике PHP делаете if (!empty($price)) $where .= ' AND `price`='.$price; |
|
|
Arks |
9.1.2014, 22:40;
Ответить: Arks
Сообщение
#6
|
|
Небольшой ликбез.
MySql на выходе отдает таблицу(rowset) либо набор таблиц(актуально для хранимок). Один запрос всегда возвращает 1 rowset. Таблица всегда полностью чем-то заполнена. Т.е. нет такого что в первой строке три колонки(colspan="3" :rolleyes:) а во второй строке - пять. Это была бы уже не таблица. Колонки таблицы определяются исключительно перечислением столбцов из участвующих таблиц, данных подставленных непосредственно (SELECT t1.a as t1a, 'MyString' as t1b ...), и из алиасов (as <...>). Выбираемые колонки перечисляются между SELECT и FROM и нигде больше. :nea: SELECT <select statement> FROM... К выбираемым столбцам могут применяться различные преобразования - одно преобразование применяется ко всем ячейкам столбца. Преобразования могут быть строковыми, математическими, агрегирующими(SUM(...), COUNT(DISTINCT ...)), и (мульти)условными(IFNULL, IF, SWITCH <столбец> CASE <условие1> THEN <результат1> CASE <условие2> THEN <результат2>... ELSE <результат3> END, COALESC и т.п.) Данные формируются уже после того как mysql получит все исходные данные таблиц в результате запроса. Т.е. фактически между SELECT и FROM указывается обработка результирующего rowset'а после-всего-всего-всего(Join'ов, фильтрации, агрегации), но до применения постфильтрации(HAVING) которая данные не изменяет, только отфильтровывает. Далее между FROM и WHERE указывается откуда и по каким критериям выбирать данные. В этом блоке обычно можно видеть как раз Join'ы и условия смежности таблиц. К условиям фильтрации(смежности) могут также применяться функции(математические, стороковые и т.п. см.выше). Оптимизатор сам перестраивает порядок JOIN'ов в процессе построения плана выполнения, можно задавать его вручную используя точные(STRAIGHT) JOIN'ы. :goodpost: Условий смежности(ON) может быть много и в целом они идентичны условиям фильтрации(WHERE), оптимизатор переписывая исходный запрос также может тасовать их(перекидывая между ON и WHERE) по своем желанию. Но так или иначе mysql не поддерживает динамическое построение запросов на основе результатов предыдущей выборки в рамках языка SQL(-> как раз для этого были придуманы хранимки). Простыми словами он не умеет - выбрали таблицу, посмотрели данные, не понравилось переписали по условиям запрос налету, и выбрали еще раз что-то другое. Это уже программирование(хранимки) предполагающее переменные - например промежуточные rowset'ы(курсоры в хранимках) или отдельные переменные(DECLARE в хранимках). Именно в хранимках возможна реализация IF .. ELSE в том виде как она есть в php. :sarcastic: Дальше идут условия фильтрации(WHERE), агрегации(GROUP BY, GROUP BY ... WITH ROLLUP), условия пост-фильтрации(HAVING) которые применяются после условий фильтрации к полученным данным, сортировки(ORDER BY) Отдельные запросы могут соединяться посредством оборачивания в подзапросы и последующим применением JOIN'ов(пересечение roset'ов полученных подзапросами), либо посредством UNION'ов(объединение строчек нескольких rowset'ов в один rowset). Как написать тот или иной запрос, использовать ли IN, временные таблицы, подзапросы, агрегацию, JOIN'ы, UNION'ы - целиком определяется структурой таблиц и тем какие данные надо получить. Ничего другого в SQL(в частности mysql) не придумали и не придумают. :xz: P.S. Многим программистам не нравятся точки и кавычки(пред.сообщение Webmaster'а). Поэтому давно изобретен такой велосипед как QueryBuilder'ы(реализаций навалом). Также стоит обратить внимание на такую известную и необходимую вещь как транзакции(виртуальные объединения запросов в области видимости) которые поддерживаются INNODB и его форками, а также MyISam форком сервера MariaDB. |
|
|
Degradator |
10.1.2014, 20:34;
Ответить: Degradator
Сообщение
#7
|
|
Вот например добавление условия после and.
set @accId := 1; "SELECT log_acc FROM `a_log` WHERE log_acc = @accId AND CASE WHEN (".intval(GET['attack']." = 1 ) THEN ( NOW( ) - DATE_ADD( log_landing, INTERVAL( SELECT account_timezone FROM a_account WHERE account_id = @accId ) HOUR ) ) <=0 ELSE ( NOW( ) - DATE_ADD( log_landing, INTERVAL( SELECT account_timezone FROM a_account WHERE account_id = @accId ) HOUR ) ) >=0 END GROUP BY log_acc, log_village;" Но вобще как по моему скромному опыту работы с MySQL, лучше обходится простыми запросами. Где то на хабре читал что один толстый запрос с join'ами отрабатывается дольше чем 10 тонких селектов по идам. |
|
|
Wins
|
Сообщение
#8
|
|
|
Я уже понял, как это сделать, все правильно при обычном извлечении использовать обычные join. А поиск то будет только по одной основной таблице, и все это можно сделать на php.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Арбитражники, как ведете учет расходов и доходов? | 11 | Boymaster | 1680 | Вчера, 23:35 автор: Boymaster |
|
Как вывести деньги в Украине с заблокированного Юмани ? | 29 | freeax | 4761 | Вчера, 1:19 автор: sergio11 |
|
Как вы отдыхаете от работы за компом | 148 | adw-kupon.ru | 19677 | 8.4.2024, 10:37 автор: Skyworker |
|
Как вы бросили работу и перешли на заработок с сайтов? | 18 | uahomka | 3082 | 5.4.2024, 5:53 автор: Skyworker |
|
Как бездомные хранят деньги? | 81 | metvekot | 13633 | 31.3.2024, 12:44 автор: Boymaster |
Текстовая версия | Сейчас: 18.4.2024, 0:34 |