19:52 

Помогите собрать запрос

Plexx
есть таблица user
поля
id name tag
1 Игорь 1,5,8,10

в поле tag записываются id тегов через запятую

как мне выбрать юзеров по конкретному тегу.

т.е. мне нужно например выбрать всех юзеров у которых в поле tag есть 8ка например.

@темы: PHP, Вопросы

Комментарии
2010-09-09 в 20:01 

Все люди делятся на две части.
Можно создать еще одну таблицу с такой структурой:
name tag
Игорь 1
Игорь 8
Игорь 11
Вася 1
Вася 7
Вася 8

2010-09-09 в 20:03 

Plexx
не вариант.

я думаю тут нужно сначала вытащить поле tag и прогнать через array потом сравнивать есть ли в массиве равенство 8ок.
и потом где есть вытаскиваем id шники и потом их всех иплодим implode (",", $id[]) и пихаем это в след запрос через in (тут все id через запятую.) как то так мыслит только работают

2010-09-09 в 20:21 

unsigned
мы так воодушевлены, что светимся
Вообще бредовое условие, но для тэга с id=1 это может выглядеть так. Модифицировать для общего случая не составит труда.
SELECT * FROM user WHERE tag REGEXP '(^|\,)1($|\,)'

2010-09-09 в 20:23 

 
не вариант.
Почему?
Только в таблице, конечно же, ссылкой должно быть не имя, а ID пользователя.

2010-09-09 в 20:26 

 
Если тэгов ограниченное количество, можно использовать тип столбца SET и функцию FIND_IN_SET для поиска.
SET ограничен 64-мя возможными значениями (хотя, возможно, от версии к версии сервера это значение различается...).
Тем не менее, почти всегда отдельная таблица будет предпочтительным вариантом решения.

2010-09-09 в 20:26 

Пушистый
За прошлые века, за этот час, за вечные дни грядущего!
Plexx нет как раз выше то именно вариант, только скорее в реальных условиях, не две а три

user
id name
1 Игорь
2 Иван

tags (тут еще можно дополнительные описания тега добавить например текстовое поле)
id
1
5
8
10

user_tags
id_tag id_user
1 1
5 1
8 1
10 1
5 2
8 2

связи

user_tags.id_tag = tags.id
user.id_user = user.id

тогда проблем чтоб выбрать всех юзеров с id_tag не будет

если же это не возможно то все стальные способы медленные извраты из-за неправильного проектирования таблиц про REGEXP уже выше написали, еще в сторону LIKE можно посмотреть и в функции работы со строками , но это стрельба из пушек по воробьям

2010-09-09 в 21:17 

--==SS==--
Sanctus Satanas
и потом где есть вытаскиваем id шники и потом их всех иплодим implode (",", $id[]) и пихаем это в след запрос через in (тут все id через запятую.) как то так мыслит только работают
Таким способом вам нужно будет, во-первых, выкачать всю таблицу пользователей; во-вторых, кеширование БД идёт лесом, а каждый раз надо заново рассчитывать одно и то же на php.
Лучше нормализуйте базу. )

2010-09-09 в 22:23 

[revolver]
Люди никогда не достигнут совершенства, пока будут оставаться людьми...
капец. а потом интернет засран говнокодом. Зачем СУБД?) Файлик сохрани и дописывай в него)

2010-09-09 в 22:59 

Мохнорыл
маленькое щячло
Зачем такой гемор?? Юзай джоины и еще одну таблицу.

2010-09-09 в 23:33 

lugavchik
Я не бог, я так низко не опускаюсь.
если таблицу менять сильно нельзя. то:
select * from table where concat(",",tag,",") like ",8,"
Если не прокатит, то:
select * from (select id,name,concat(",",tag,",") as tag) where tag like ",8,"

2010-09-10 в 11:15 

Plexx
Спасибо попробуем реализовать тремя таблицами.. Я в сторону производительности.

2010-09-10 в 14:49 

unsigned
мы так воодушевлены, что светимся
Plexx про индексы не забудьте.

2010-09-10 в 15:35 

Plexx
Plexx про индексы не забудьте.

Поподробнее если можно...

2010-09-10 в 17:23 

[revolver]
Люди никогда не достигнут совершенства, пока будут оставаться людьми...
2010-09-10 в 18:35 

Plexx
[revolver] Спасибо...


Дабы не постить еще одну новость подскажите еще в одном запросе.



Есть таблица user с полями
user friend approve
1 2 1
1 5 1
1 6 1
8 1 1


Нужно вывести все user и friend кроме 1. Т.е на выходе получить 2 5 6 8

и плюс как будет выглядеть LEFT JOIN если нужно приравнять id с другой таблицей два поля user и friend??

2010-09-10 в 18:55 

Мохнорыл
маленькое щячло
Нужно вывести все user и friend кроме 1. Т.е на выходе получить 2 5 6 8
SELECT blabla,blabla FROM blabla WHERE blablalba != 1


Во втором случаи там тогда юзаеться ASS

2010-09-10 в 19:00 

Plexx
Блин немного не правильно выразился.

НУЖНО ВЫТАЩИТЬ все цифры из user и friend где user и friend = 1

т.е. на выходи получаем

У юзера 1

друзья 2 5 6 8


Мохнорыл
а если таблицу дополнить
1 2 1
1 5 1
1 6 1
8 1 1
2 5 1
9 5 1

2010-09-10 в 19:28 

lugavchik
Я не бог, я так низко не опускаюсь.
select * from table where user=1 or friend=1

или одним столбцом
select user from table where friend=1
union
select friend from table where user=1

2010-09-10 в 19:31 

Мохнорыл
маленькое щячло
SELECT blabla,blabla FROM blabla WHERE blablalba = 1 and blablablbalba = 1

Почитай лучше про синтаксис джоинов и эсы в них. В итоге у тебя на выходе и получится друзья 2 5 6 8

2010-09-10 в 19:40 

Plexx
SELECT blabla,blabla FROM blabla WHERE blablalba = 1 and blablablbalba = 1

Почитай лучше про синтаксис джоинов и эсы в них. В итоге у тебя на выходе и получится друзья 2 5 6 8


а как их вывести? я же должен в цикле обратится не к одному полю user_id а еще и к friend_id

2010-09-11 в 17:46 

Plexx
Все разобрался.

Собрал запрос так

SELECT a.*, b.* FROM users as a LEFT JOIN users as b ON (b.user_id = a.friend_id or b.user_id = a.user_id) and b.user_id!='1' WHERE (a.friend_id='1' or a.user_id='1')

     

Сообщество PHP программистов

главная