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

Форум MySQL

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

 

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

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

тема: Объединить три SQL-запроса в один
 
 автор: tima2010   (09.12.2011 в 11:58)   письмо автору
 
 

Привет, помогите пожалуйста объединить три запроса:


SELECT myid FROM mytable WHERE key='name' AND value='$name' ORDER BY `myid`
SELECT myid FROM mytable WHERE key='lang' AND value LIKE '%$lang%' ORDER BY `myid`
SELECT myid FROM mytable WHERE key='state' AND value='$state' ORDER BY `myid`


Если писать так, то результат не получаю (

SELECT myid FROM mytable WHERE key='name' AND key='lang' AND key='state' AND value='$name' AND LIKE '%$lang%' AND value='$state' ORDER BY `myid`

  Ответить  
 
 автор: tima2010   (09.12.2011 в 12:02)   письмо автору
 
   для: tima2010   (09.12.2011 в 11:58)
 

нужно чтобы выбрались ID где
ключ = и NAMe и LANG и STATE
так же где значение = и Имени и Языку и Стастусу

  Ответить  
 
 автор: cheops   (09.12.2011 в 14:22)   письмо автору
 
   для: tima2010   (09.12.2011 в 11:58)
 

Возможно вам нужен следующий запрос
SELECT
  myid
FROM
  mytable
WHERE
    (key='name' AND value='$name')
  OR
    (key='lang' AND value LIKE '%$lang%')
  OR
    (key='state' AND value='$state')
ORDER BY
  myid

  Ответить  
 
 автор: tima2010   (09.12.2011 в 19:09)   письмо автору
 
   для: cheops   (09.12.2011 в 14:22)
 

Здравствуйте cheops, на сколько я знаю OR означает ИЛИ
а мне нужно точное совпадение...
Пока что сделал так но мне это не нравится, кажется, что есть другой выход:

$res1 = "SELECT myid FROM mytable WHERE key='name' AND value='$name' ORDER BY `myid`";
foreach ($res1 as $row) {
    $id1 .= "myid='".$row->myid."' OR ";
}
$id1 = substr($id1,0,-4);

$res2 = "SELECT myid FROM mytable WHERE ( $id1 ) AND value LIKE '$lang%' ORDER BY `myid`";
foreach ($res2 as $row) {
    $id2 .= "myid='".$row->myid."' OR ";
}
$id2 = substr($id2,0,-4);

$res3 = "SELECT myid FROM mytable WHERE ( $id2 ) AND value='$state' ORDER BY `myid`";

  Ответить  
 
 автор: cheops   (09.12.2011 в 19:34)   письмо автору
 
   для: tima2010   (09.12.2011 в 19:09)
 

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

  Ответить  
 
 автор: tima2010   (09.12.2011 в 23:02)   письмо автору
 
   для: cheops   (09.12.2011 в 19:34)
 

Существует форма выбора записи:
1. Имя
2. Язык
3. Статус

далее нужно найти в таблице ID запись которая соответствует всем 3 параметрам,
все параметры записаны в value в одной таблице

  Ответить  
 
 автор: cheops   (09.12.2011 в 23:26)   письмо автору
 
   для: tima2010   (09.12.2011 в 23:02)
 

Правильно ли я понимаю, что все три запроса возвращают одно и тоже значение?
SELECT myid FROM mytable WHERE key='name' AND value='$name' ORDER BY `myid` 
SELECT myid FROM mytable WHERE key='lang' AND value LIKE '%$lang%' ORDER BY `myid` 
SELECT myid FROM mytable WHERE key='state' AND value='$state' ORDER BY `myid`
А вы хотите получить одно значение при условии, что значения, возвращаемые всеми тремя запросами одинаковые?

  Ответить  
 
 автор: tima2010   (09.12.2011 в 23:52)   письмо автору
 
   для: cheops   (09.12.2011 в 23:26)
 

Да, Вы все верно поняли, получается мне нужно выбрать myid который соответствует всем 3 запросам.

  Ответить  
 
 автор: cheops   (10.12.2011 в 14:44)   письмо автору
 
   для: tima2010   (09.12.2011 в 23:52)
 

Тогда вероятно придется какой-то такой запрос использовать, ну или начать отталкиваться от него
SELECT
  fst.myid AS myid
FROM
  (SELECT
     myid
   FROM
     mytable
   WHERE
     key='name' AND
     value='$name') AS fst
JOIN
  (SELECT
     myid
   FROM
     mytable
   WHERE
     key='lang' AND
     value LIKE '%$lang%') AS snd
ON
  fst.myid = fst.snd
JOIN
  (SELECT
     myid
   FROM
     mytable
   WHERE
     key='state' AND
     value='$state') AS thd
ON
  snd.myid = thd.snd

  Ответить  
 
 автор: tima2010   (12.12.2011 в 22:27)   письмо автору
 
   для: cheops   (10.12.2011 в 14:44)
 

Большое спасибо, но неужели ранее поиск не осуществлялся при такой структуре таблицы:


id | myid | key   | value
1    1      name    tima
2    1      lang    rus
3    1      state   какой либо текст
4    2      name    tima
5    2      lang    rus
6    2      state   мой особый текст
7    3      name    tima
8    3      lang    rus
9    3      state   не совпадающий статус
10   4      name    cheops
11   4      lang    eng
12   4      state   текст текст текст


и нужно к примеру получить myid которые соответствует всем 3-м запросам поиска
Найти myid где
имя tima
где язык rus
где в статусе есть слово "текст"

p.s. а что быстрее работает, ваш вариант или мой?

  Ответить  
 
 автор: cheops   (12.12.2011 в 22:43)   письмо автору
 
   для: tima2010   (12.12.2011 в 22:27)
 

>но неужели ранее поиск не осуществлялся при такой структуре таблицы
Ммм... не очень понятно, что значит ранее. Вообще это одна из нормальных форм (не помню какая :), и поиск по ней, конечно, же осуществлялся. Не очень понятно, что вас смущает.

>p.s. а что быстрее работает, ваш вариант или мой?
Измерять надо (от индексации еще зависит - можно и так и эдак повернуть), если накладные расходы по обмену запросами с сервером не велики, большой разницы быть не должно.

  Ответить  
 
 автор: tima2010   (12.12.2011 в 22:45)   письмо автору
 
   для: cheops   (12.12.2011 в 22:43)
 

ясно, спасибо! буду разбирать ваш запрос по словам чтобы его понять

>>Ммм... не очень понятно, что значит ранее.
имею введу не встречал таких тем и статей )
и читая Ваши слова: "Тогда вероятно придется какой-то такой запрос использовать"
подумал что как будто это не обычно

  Ответить  
 
 автор: cheops   (12.12.2011 в 22:58)   письмо автору
 
   для: tima2010   (12.12.2011 в 22:45)
 

Тут штука в том, что у вас таблица не до конца нормализована - это ускоряет ряд запросов, но приводит к более зубодробительным SQL-запросам. С одной стороны недонормированная таблица - это не частое явление (возникает там, где нужна скорость), поэтому и запросы могут выглядеть немного странно. С другой стороны SQL знают мало, как правило, на нём даже специализируются (т.е. изучают только его), изучать его не просто - так как это декларативный язык. Вот если вы знаете императивный язык вроде PHP, то выучить другой императивный язык вам будет проще, третий еще проще. А SQL, хоть пять императивных языков знайте - придется учить с нуля. Разработчикам же база данных зачастую нужна для хранения информации, а не чтобы программы на SQL писать, поэтому возможности SQL используются довольно слабо и на это есть причины. Мало составить SQL-запрос, так его и другие понять должны... в общем тут палка о двух концах, с одной стороны SQL еще и не такое позволяет, а с другой сложный запрос может затормозить развитие системы, если к нему никто не будет знать как подступиться. Аналогичная ситуация и в других системах, например связка PHP + HTML/JavaScript - куда ударение ставить, зависит от квалификации, нагрузки и возможностей. Связей таких в мире IT довольно много, все знать все-равно не будете, поэтому нужно выбирать что и на каком уровне вы будете знать, какие инструменты использовать на полную катушку, а какие лишь поверхностно.

PS Понятно, что чем больше вы знаете, тем вы более востребованы как специалист.

  Ответить  
 
 автор: tima2010   (12.12.2011 в 23:05)   письмо автору
 
   для: cheops   (12.12.2011 в 22:58)
 

Спасибо, хочу все знать, с Вами и форумом softtime мы становимся умнее :)
все таки решил добить этот вопрос, разберусь и напишу здесь ответ, найду альтернативный вариант более простой и компактный

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

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