массив + запрос

Grapefruit Lips

Новичок
массив + запрос

Что то я запутался =(

Вот есть у меня array, вида:
$numbers=array("1","8","5","22");

есть таблица TXT:

id - - - one - - - two - - - three
1 - - - - 5 - - - - 2 - - - - - - 8
2 - - - - 1 - - - - 8 - - - - - - 22
3 - - - - 1 - - - - 8 - - - - - - 22
4 - - - - 9 - - - - 1 - - - - - - 2

как мне выбрать те колонки , где one, two и three = 1 , 8 и 22

т.е. не прописывать самому WHERE one=1 and two=8 and three=22

а как узнать, есть ли в таблице TXT , в колонках One, Two и Three те 3 цифры, которые есть в массиве $numbers, и если есть - вывести их запросом из таблицы

как это можно сделать?
 

Necromant

Новичок
PHP:
$sql = "SELECT * FROM txt WHERE one IN (".join(",", $numbers).") AND 
two IN (".join(",", $numbers).") AND three IN (".join(",", $numbers).")
";
 

Grapefruit Lips

Новичок
Спасибо большое!!
мне это ООООЧЕНЬ пригодится!

-~{}~ 08.03.06 15:31:

А вот ещё вопросик, а если в массиве русские слова??

$massiv_slov это:
PHP:
Array ( [0] => тут [1] => каждое [2] => слово [3] => массива )
Я решил это вот так:
PHP:
$like_for=join("' or word  ='",  $massiv_slov);
$all_temp=" word = '".$like_for."' ";

$sql="SELECT * FROM txt  WHERE  ".$all_temp."";
т.е. WHERE word='тут' or word ='каждое' or .. и т.д...
потому что WHERE word IN(".join(",", $massiv_slov).") не работает, не видит слово =( , предполагаю, что IN только для цифр..

Правильно ли это? или для sql запроса есть подходящяя функция?
Или это проблемы кодировки?
 

Grapefruit Lips

Новичок
спасибо, Wicked

У меня ещё вопрос по теме =)
Например, в таблице есть поле one с разным содержанием:

20,5
19,20
20,50,41,19,7
19,20
20,19
20

"мой запрос" это массив, например -
PHP:
$massiv = array("19","20");
или
PHP:
$massiv2 = array("20","19","1","99");
нужно выбрать всё, где поле one ( 19,20 и 20,19 - неважно как они стоят в поле ONE) совпадает с $massiv. Или с $massiv2, где тоже есть 19 и 20 но в полях ONE нету 1 и 99...
(одно - order by rand() limit 1)

Я пробывал вывести всё и сравнить массивы поля one и *массив запроса* ($massiv) функцией array_diff ($arr_diff_result=array_diff($massiv,$exploded_row_one) ), т.е. если count($arr_diff_result)==0 , то совпало.. но как же быть с $massiv2 ? т.е там есть 20 и 19, но в полях ONE нету 1 и 99

например:

$massiv это: 20,40,5,1 - - - - - получаем всё, где поле = 40,1,20,5
$massiv это: 20,88,81,80 - - - - - получаем всё, где поле = 20 (т.к 88, 81 и 80 ненайдены)
$massiv это: 20,7 - - - - - получаем всё, где поле = 7,20 и 20,7
$massiv это: 5,88 - - - - - получаем всё, где поле = 5

Может кто подскажет?
и не слишком ли это всё сложно? =((((
 

Grapefruit Lips

Новичок
в смысле? что именно?

я думаю весь гемор из за массивов, т.е. в одном поле one serialize(массив);
нереально для каждой цифры своё поле делать, ибо их сколько угодно может быть, но зато легче сравнивать

-~{}~ 10.03.06 13:53:

вобщем всё решил функциями for, if, explode, in_array, count и trim

но всё равно, что значит нормализация бд?
 

Wicked

Новичок
я не говорил, что нужно для каждой цифры делать свое поле. Для каждой цифры нужно делать _запись_ в другой таблице.

Т.е. у тебя будет таблица table2, содержащая 2 столбца:
table1_fk | one
1 | 20
1 | 5
-------
2 | 19
2 | 20
-------
3 | 20
3 | 50
3 | 41
3 | 19
3 | 7
...
 

Grapefruit Lips

Новичок
Понятненько.
А какие приемущества этого? И почему лучше не держать в поле массив , через serialize , или же просто текст "2,1,4,20,8" ?
 
Сверху