array & MySQL

12 отговора 276 прегледа
#1

array & MySQL

Имам едно select меню с включено multiple. Избирам няколко опции и ги вкарвам в една колона от таблица в MySQL. След това знам как да ги извикам и да ги видя, но проблема е друг. Не мога да претърсвам тази клетка. Искам например да се появят всички юзъри които са избрали опция 1. Когато направя нещо като това:

select * from table1 where choice = '1'

не получавам смислен резултат, ако въобще се получи нещо.

Някой ще помогне ли?

Отговор
в отговор на burov #2

Re: array & MySQL

хм, не съм много сигурен, че те разбрах. Тези няколко опции ги вкарваш в една колона ли? Това означава ли, че имаш поле тип "сет"? Понеже сет е неудобно нещо, аз съм решил по друг начин въпроса, когато ми се налага да работя с множество стойности. Всъщност има два варианта:
единият е да ги вкарваш стойностите като стринг и после да търсиш дали се съдържа каквото ти трябва в тоя стринг. Това мисля че ще свърши работа, но е малко неефективно.
Има и друг вариант, който е малко по-сложен, пък и върши работа, ако стойностите не са повече от 5-6, но за сметка на това е много ефективен. Правиш си няколко стойности, всяка от които да съответства на конкретен избор от менюто. Трябва да ги направиш такива интове, че в двоичното им представяне да не съвпадат единици. като получиш резултата, обединяваш ги с побитово или. Така ще получиш уникален резултат за всяка възможна комбинация /*бтв, така работят много от АПИ функциите на виндовс*/ и можеш да търсиш в сложен суич кейз или вложени иф-ове. . Знам, че изисква доста труд, но ако не можеш да избегнеш сета, това наистина е адски ефективно.
Успех, стига да съм те разбрал правилно.

Отговор
в отговор на voyager #3

Re: array & MySQL

за кви иф-ове говоря, ти искаш да си ги видиш в заявка, още по лесно:
select * from table_name where stoinost=5 or stoinost = 47... i t. n.
където съм дал някакви примерни числени стойности, представящи обединенията от възможни избори, съдържащи примерно, оция 1

I want to walk into the lights

Отговор
в отговор на burov #4

Re: array & MySQL

predpolagam che imash neshto kato

userid | choice
------------------
1 | 1
1 | 5
2 | 3
2 | 4
3 | 2
3 | 4
4 | 1
4 | 2

pri select userid from table where choice='1' shte ti se izvedat samo tezi useri koito imat choice 1, to est 1vi i 4ti.

stiga da imash sushtata structura de.

puffff
Отговор
в отговор на xc #5

Re: array & MySQL

реших си проблема като преобразувах масивите в низове чрез implode
По този начин вместо в клетката да вкарвам масив, аз вкарвам низ от стойности, нещо като 1, 34, 23, 181

и после когато искам да търся, изполвам:

select * from table 1 where choise = '%,23,%' or choise = '23,%' or choise = '%,23';

и така разбирам кой юзър е избрал опция 23

Отговор
в отговор на burov #6

Re: array & MySQL

достатъчно е просто да напишеш
where choise='%23%' :)
% замества произволен брой символи, включително и нула. Така че в тоя случай or е излишно

да цепиш дърва
да носиш вода


Отговор
в отговор на voyager #7

Re: array & MySQL

да, така е, но в този случай като резултат ще получиш не само 23 но и 123 и 230. Ето защо аз в implode съм дефинирал запетайката като разделител и я използвам в търсенето:

'%, 23,%' - това е 23, но вътре някъде в низа (45, 23, 47, 432)

'23,%' - това е 23, но като първа стойност в низа (23, 15, 654, 2)

'%, 23' - това пък е 23, но като последна стойност в низа (34, 165, 23)

Отговор
в отговор на burov #8

Re: array & MySQL

prav si :) ne bqh se setil, 4e moje da ima6 i drugi takiva stoinosti :)

Отговор
в отговор на burov #9

Re: array & MySQL

В mySQL има прост regexp който може да свърши работа,
вместо %,23,% и %23, и ,23%
но не е там работата.
Смята се за неправилно да имаш няколко стойности в една колона - базата не е приведена във първа нормална форма (или май беше втора :).
Нещо повече не ти препоръчвам да слагаш в базата нещо различно от една стойност, независимо че може да качиш масив, обект, картинка и т.н
Послушай xc
Вместо една таблица
user
id choice
1 2,3
2 1,4
3 2,4,5

махни втората колона и си направи и втора таблица

choices
userid choice
1 2
1 3
2 1
2 4
3 2
3 4
3 5

Разбираш нали?
Поздрави!

_________________________________________
Мили деца, xxx.com не е сайта на "трите хикса".
Отговор
в отговор на нeщacтeн #10

Re: array & MySQL

От гледна точка на оптимизацията си прав. Обаче от гледна точка на броя заявки които трябва да отправя към базата-данни? Ако искам да получа цялата информация за потребителите избрали опция 23 в твоя случай ще имам

1. заявка към таблица choises
2. със всяка от стойностите на UserID ще трябва да направя по още една заявка за да получа конкретната информация за потребителя.

или ако 150 души са избрали опция 23 аз ще трябва да направя: една заявка към таблицата със отговорите (choises) и още сто и петдесет заявки да да получа информацията за всеки потребител (ime, email, age, country....) или общо 151 заявки към базата-данни


А в моя случай същата информация ще я получа само с една заявка.

Отговор
в отговор на burov #11

Re: array & MySQL

Да си чувал за JOIN в SQL-a :))

SELECT u.name, u.email, u.age ..... FROM choises as c, users as u WHERE c.choise = '23' AND c.user_id = u.user_id

и си готов с една заявка.

[линк]

...
Отговор
в отговор на burov #12

Re: array & MySQL

Neznam dali razbira6 PHP-to, no opredeleno 6te trqbva da po4ete6 za MySQL
(ne se obijda6 nali :) Vijdam 4e admina me e izprevaril i ve4e ti e otgovoril.
Drugiqt na4in po koito moje6 da si napi6e6 (edinstvenata) zaqvka e:

SELECT user.choice
FROM user
LEFT JOIN choices
ON user.id = choices.userid


Po tozi na4in si predstavi 4e kym pyrvata ti tablica user se zalepvat
vsi4ki koloni ot vtorata, no samo tezi redove za koito e izpylneno
uslovieto user.id = choices.userid.
Pozdravi!

_________________________________________
Мили деца, xxx.com не е сайта на "трите хикса".
Отговор
в отговор на нeщacтeн #13

10x

да, има още много да се учи...

Благодаря Ви.

Отговор