SQL Array Search - PullRequest
       3

SQL Array Search

0 голосов
/ 09 февраля 2012

У меня есть групповая функция на моем веб-сайте, которая позволяет 1 пользователю размещать идентификаторы пользователей любого из его или ее друзей в столбце "Зарегистрированные пользователи". Мне нужно выполнить поиск SQL, чтобы определить, был ли зарегистрированный идентификатор пользователя сохранен в каких-либо столбцах приглашения пользователей его или ее друзьями. Как я могу сделать это с помощью поиска SQL?

EX: Мой столбец приглашен пользователями, и внутри этого столбца хранится следующее (234 394 479) Когда вошел в систему идентификатор пользователя 234. Мне нужно выполнить поиск, чтобы увидеть, есть ли в каких-либо столбцах идентификатор пользователя 234., хранящийся в столбце "Зарегистрированные пользователи".

SELECT userid, name... FROM mytable WHERE invitedusers = ?

* Я посмотрел на оператор SQL IN вместе с FIND_IN_SET, но не помог ни с одним из них. *

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

Предполагая, что вы действительно используете 234,394,479 в качестве значения одного столбца (по крайней мере, вы должны использовать ,234,394,479,, чтобы иметь возможность сделать WHERE invited LIKE '%,234,%' в своем запросе), вам нужно перестроить свои пользовательские таблицы, удалить поле invited_users и создайте таблицу следующим образом:

CREATE TABLE invited_users (
  id INT AUTO_INCREMENT,
  owner_id INT, -- Who's input it is
  target_id INT, -- What's the target user
  PRIMARY KEY ( id),
  UNIQUE ( owner_id, target_id),
  -- Indexes (FOREIGN KEYs!) to users table
);

А затем просто выберите список пользователей, которые пригласили пользователя 234 с запросом:

SELECT users.id, users.name
FROM invited_users
INNER JOIN users ON invited_users.owner_id = users.id
GROUP BY users.id
WHERE invited_users.target_id = 234
1 голос
/ 09 февраля 2012

Это должно сделать работу:

SELECT userid, name... FROM mytable WHERE FIND_IN_SET('234', invitedusers) !=0;
1 голос
/ 09 февраля 2012

Возможно, вы не захотите хранить список с разделителями-запятыми в столбце, но так как вы:

SELECT userid, name FROM mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry

Я изменил на основании комментария EBarr.Есть четыре случая, чтобы проверить.Это предполагает, что вы храните данные с суффиксом (префикс и а) и разделяете все запятыми.

Вот несколько тестов, чтобы доказать, что это работает:

/* Tests */
INSERT INTO @mytable SELECT 11, 'a', '(234)' -- Should get returned
INSERT INTO @mytable SELECT 12, 'b', '(1234)'
INSERT INTO @mytable SELECT 13, 'c', '(92349)'
INSERT INTO @mytable SELECT 13, 'd', '(2345)'

INSERT INTO @mytable SELECT 21, 'a', '(234,567)' -- Should get returned
INSERT INTO @mytable SELECT 22, 'b', '(1234,567)'
INSERT INTO @mytable SELECT 23, 'c', '(92349,567)'
INSERT INTO @mytable SELECT 23, 'd', '(2345,567)'

INSERT INTO @mytable SELECT 31, 'a', '(567,234)' -- Should get returned
INSERT INTO @mytable SELECT 32, 'b', '(567,1234)'
INSERT INTO @mytable SELECT 33, 'c', '(567,92349)'
INSERT INTO @mytable SELECT 33, 'd', '(567,2345)'

INSERT INTO @mytable SELECT 41, 'a', '(123,234,789)' -- Should get returned
INSERT INTO @mytable SELECT 42, 'b', '(123,1234,789)'
INSERT INTO @mytable SELECT 43, 'c', '(123,92349,789)'
INSERT INTO @mytable SELECT 43, 'd', '(123,2345,789)'

SELECT userid, name FROM @mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry
0 голосов
/ 09 февраля 2012

Я не уверен, что это лучший способ, но:

where concat(',',invitedusers,',') like '%,234,%'

Итак, в вашем примере ,234, находится внутри ,234,394,479,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...