|
|
|
| Привет, помогите пожалуйста объединить три запроса:
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 в 11:58)
| | нужно чтобы выбрались ID где
ключ = и NAMe и LANG и STATE
так же где значение = и Имени и Языку и Стастусу | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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`";
|
| |
|
|
|
|
|
|
|
для: tima2010
(09.12.2011 в 19:09)
| | Вы вибираете какое-то одно значение из первых трех запросов или вам нужно их свести в один? Предложенный вариант просто сворачивает три отдельных запроса в один. Здесь не только логика ИЛИ используется, она используется совместно с И. | |
|
|
|
|
|
|
|
для: cheops
(09.12.2011 в 19:34)
| | Существует форма выбора записи:
1. Имя
2. Язык
3. Статус
далее нужно найти в таблице ID запись которая соответствует всем 3 параметрам,
все параметры записаны в value в одной таблице | |
|
|
|
|
|
|
|
для: 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`
| А вы хотите получить одно значение при условии, что значения, возвращаемые всеми тремя запросами одинаковые? | |
|
|
|
|
|
|
|
для: cheops
(09.12.2011 в 23:26)
| | Да, Вы все верно поняли, получается мне нужно выбрать myid который соответствует всем 3 запросам. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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. а что быстрее работает, ваш вариант или мой? | |
|
|
|
|
|
|
|
для: tima2010
(12.12.2011 в 22:27)
| | >но неужели ранее поиск не осуществлялся при такой структуре таблицы
Ммм... не очень понятно, что значит ранее. Вообще это одна из нормальных форм (не помню какая :), и поиск по ней, конечно, же осуществлялся. Не очень понятно, что вас смущает.
>p.s. а что быстрее работает, ваш вариант или мой?
Измерять надо (от индексации еще зависит - можно и так и эдак повернуть), если накладные расходы по обмену запросами с сервером не велики, большой разницы быть не должно. | |
|
|
|
|
|
|
|
для: cheops
(12.12.2011 в 22:43)
| | ясно, спасибо! буду разбирать ваш запрос по словам чтобы его понять
>>Ммм... не очень понятно, что значит ранее.
имею введу не встречал таких тем и статей )
и читая Ваши слова: "Тогда вероятно придется какой-то такой запрос использовать"
подумал что как будто это не обычно | |
|
|
|
|
|
|
|
для: tima2010
(12.12.2011 в 22:45)
| | Тут штука в том, что у вас таблица не до конца нормализована - это ускоряет ряд запросов, но приводит к более зубодробительным SQL-запросам. С одной стороны недонормированная таблица - это не частое явление (возникает там, где нужна скорость), поэтому и запросы могут выглядеть немного странно. С другой стороны SQL знают мало, как правило, на нём даже специализируются (т.е. изучают только его), изучать его не просто - так как это декларативный язык. Вот если вы знаете императивный язык вроде PHP, то выучить другой императивный язык вам будет проще, третий еще проще. А SQL, хоть пять императивных языков знайте - придется учить с нуля. Разработчикам же база данных зачастую нужна для хранения информации, а не чтобы программы на SQL писать, поэтому возможности SQL используются довольно слабо и на это есть причины. Мало составить SQL-запрос, так его и другие понять должны... в общем тут палка о двух концах, с одной стороны SQL еще и не такое позволяет, а с другой сложный запрос может затормозить развитие системы, если к нему никто не будет знать как подступиться. Аналогичная ситуация и в других системах, например связка PHP + HTML/JavaScript - куда ударение ставить, зависит от квалификации, нагрузки и возможностей. Связей таких в мире IT довольно много, все знать все-равно не будете, поэтому нужно выбирать что и на каком уровне вы будете знать, какие инструменты использовать на полную катушку, а какие лишь поверхностно.
PS Понятно, что чем больше вы знаете, тем вы более востребованы как специалист. | |
|
|
|
|
|
|
|
для: cheops
(12.12.2011 в 22:58)
| | Спасибо, хочу все знать, с Вами и форумом softtime мы становимся умнее :)
все таки решил добить этот вопрос, разберусь и напишу здесь ответ, найду альтернативный вариант более простой и компактный | |
|
|
|