Проблема с SQL-запросом. Должен ли я использовать союз? - PullRequest
2 голосов
/ 23 апреля 2009

У меня есть проблема, которая кажется легкой на бумаге, но у меня есть большая проблема - выяснить, как лучше написать один запрос.

У меня есть стол

CREATE TABLE `profile_values` (  
  `fid` int(10) unsigned NOT NULL default '0',  
  `uid` int(10) unsigned NOT NULL default '0',  
  `value` text,  
  PRIMARY KEY  (`uid`,`fid`),  
  KEY `fid` (`fid`)  
) 

Смысл этой таблицы - хранить информацию о профиле пользователя.
Например. типичная строка будет выглядеть следующим образом ..

fid | uid | value  
__________________
1   | 77  | Mary  
11  | 77  | Poppins  
1   | 123 | Steve  
11  | 123 | Davis  

Примечание:

'fid' of '1' represents the first name  
'fid' of '11' represents the last name  
'uid' is a users id within the site.  

Я пытаюсь вернуть все идентификаторы, которые удовлетворяют условию имени, такого как 'S%', и фамилии, такой как 'D%'.
Причина в том, что мне это нужно, потому что у меня есть окно поиска автозаполнения для пользователей на сайте.
Так что, если я введу «S» в поле поиска, я увижу список всех пользователей, которые начинаются с буквы «S», если я сейчас наберу пробел и «D», я теперь смогу увидеть список пользователей, которые соответствуют оба условия.

Кто-нибудь знает, как это можно сделать? Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 23 апреля 2009

Таблица, которую вы показали, выглядит как классический пример эффекта внутренней платформы антишаблон.

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

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

Тогда ваш запрос будет выглядеть примерно так:

select * from users where first_name like 's%' and last_name like 'd%'
4 голосов
/ 23 апреля 2009
select firstname.uid, fistname.value, lastname.value
from 
  profile_values firstname
  inner join profile_values lastname 
    on firstname.uid = lastname.uid
WHERE
  firstname.fid = 1
  AND lastname.fid = 11
  AND fistname.value like 'S%'
  AND lastname.value like 'D%'

или, с таблицей пользователей

select users.uid, fistname.value, lastname.value
from 
  users
  inner join profile_values firstname
    on firstname.uid = users.uid
    AND firstname.fid = 1   
  inner join profile_values lastname 
    on lastname.uid = users.uid
    AND lastname.fid = 11
WHERE
  fistname.value like 'S%'
  AND lastname.value like 'D%'

EDIT:

Забыл упомянуть: union плохо работает на многих dbms. Если вам нужен союз, в вашей модели базы данных в основном что-то не так. Используйте любую другую альтернативу перед использованием union.

2 голосов
/ 23 апреля 2009

Регистрация на profile_values ​​ дважды как это:

SELECT p1.uid
FROM profile_values p1, profile_values p2
WHERE p1.uid=p2.uid AND p1.fid=1 AND p2.fid=11
  AND p1.value LIKE 'S%'
  AND p2.value LIKE 'D%'
2 голосов
/ 23 апреля 2009
SELECT  *
FROM    profile_values pv1
WHERE   pv1.fid = 1
        AND pv1.value LIKE 'M%'
JOIN    profile_values pv11
ON      pv11.fid = 11
        AND pv11.value LIKE 'D%'
        AND pv11.uid = pv1.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...