Запрос выбора MYSQL, где должно существовать несколько условий в одном столбце - PullRequest
0 голосов
/ 19 мая 2010

Я создаю сайт знакомств, и у меня возникла проблема с запросом mysql.

Это работает:

SELECT *
FROM `user`
   , `desired_partner`
   , `user_personality`
WHERE dob BETWEEN '1957-05-18' AND '1988-05-18'
  AND country_id = '190'
  AND user.gender_id = '1'
  AND user.user_id = desired_partner.user_id
  AND desired_partner.gender_id = '2'
  AND user.user_id = user_personality.user_id
  AND user_personality.personality_id = '2'

sql находит любого мужчины (gender_id=1) с чертой личности ATLEAST 2 (и, возможно, с другими чертами личности) между определенными возрастными диапазонами в США (country_id=190), которые ищут женщину (gender_id=2).

  • Вопрос 1) Как мне сделать так, чтобы он возвращал ТОЛЬКО людей с типом личности 2 и без каких-либо других черт личности?

    Найдите в США любого мужчину в возрасте от 22 до 53 лет, имеющего тип личности 2 (только), который ищет женщину.

  • Вопрос 2) Предположим, я хочу найти человека, который соответствует ТОЛЬКО типу личности 1, типу личности 2 и типу личности 5. В базе данных имеется 14 черт личности, и пользователь может быть связан с любым из них.

    Найдите в США любого мужчину в возрасте от 22 до 53 лет с типом личности 1, 2 и 5 (ТОЛЬКО), который ищет женщину.

------- Добавление дополнительной информации:

1) Найдите в США любого мужчину в возрасте от 22 до 53 лет (тип 2), который ищет женщину.

SQL будет использовать эти таблицы:

пользователь desired_partner user_personality

Таблица пользователей содержит информацию о профиле, которую мы хотим получить из базы данных (user_id, desc, электронная почта, пароль, dob, sex_id, country_id, state_id, city, ethity_id)

В таблице required_partner указывается, что пользователь ищет в качестве партнера (то есть мужской, женский), первичный ключ - required_partner_id, содержит идентификатор_пользователя и пол_ид

В таблице user_personality первичным ключом является user_personality_id, который содержит user_id и personal_id

Таблица user_personality необходима, потому что идентификатор user_id может быть связан с разными идентификаторами personal_id.

индивидуальный_идентификатор можно использовать для поиска имени_лицы в таблице личностей, как это определено: индивидуальный_идентификатор, имя_личности

Вот проблема:

Что если член имеет тип личности 1 и тип личности 4

Это будет представлено в базе данных как:

таблица user_personality user_personality_id = 1 user_id = 1 personal_id = 1 user_personality_id = 2 user_id = 1 personal_id = 4

Если бы я хотел найти только людей с типом личности 1, то запрос ниже не сработал бы, поскольку он включал бы user_id = 1, который также имеет тип личности 4.

выберите * от пользователя user_personality, где user.user_id = user_personality.user_id и user_personality.personality_id = 1

Теперь, скажем, участник хочет выполнить поиск человека, у которого есть тип личности 1 и тип личности 5, а другие индивидуальные идентификаторы личности не связаны с его идентификатором пользователя. Как будет выглядеть sql?

Ответы [ 3 ]

2 голосов
/ 19 мая 2010

Первый вопрос:

Вы уверены, что ваш исходный запрос возвращает также другой тип личности ? Потому что вы явно запрашиваете тип 2.
Я не понимаю, как это должно вернуть других личностей. (Так что это уже будет ответом на ваш первый вопрос).

Второй вопрос:

Используйте оператор IN:

AND user_personality.personality_id IN ('1', '2', '5')

Если это не поможет, вам следует лучше объяснить структуру таблицы, чтобы мы знали, какие существуют отношения между ними.

0 голосов
/ 24 декабря 2012

Использование подвыборов NOT IN, как правило, имеет большой успех. Путем дополнительного ЛЕВОГО СОЕДИНЕНИЯ с личностью пользователя на любом объекте, НО идентификатор личности = 2. Если он найден, он имеет несколько черт характера и игнорирует их. Сохранять, только если в псевдониме "UserP2"

найдено NULL
SELECT 
      U.*
   FROM 
      `user` U
          JOIN `user_personality` UserP
             ON U.User_ID = UserP.User_ID
             AND UserP.Personality_ID = '2'
          JOIN `user_personality` UserP2
             ON U.User_ID = UserP2.User_ID
             AND UserP2.Personality_ID != '2'
          JOIN `desired_partner` DP
             ON U.User_ID = DP.User_ID
             AND DP.Gender_ID = '2'
   WHERE
          U.Country_ID = '190'
      AND U.Gender_ID = '1'
      AND U.DOB BETWEEN '1957-05-18' AND '1988-05-18'
      AND UserP2.User_ID IS NULL

Во-вторых, просто используйте предложение "IN" для типов, которые вы хотите ... Если вы не хотите убедиться, что у пользователя есть ВСЕ 3 черты личности.

SELECT 
      U.*
   FROM 
      `user` U
          JOIN `user_personality` UserP
             ON U.User_ID = UserP.User_ID
             AND UserP.Personality_ID IN ( '1', '2', '5' )
          JOIN `desired_partner` DP
             ON U.User_ID = DP.User_ID
             AND DP.Gender_ID = '2'
   WHERE
          U.Country_ID = '190'
      AND U.Gender_ID = '1'
      AND U.DOB BETWEEN '1957-05-18' AND '1988-05-18'
0 голосов
/ 04 июня 2010

Решение вопроса № 1

AND NOT EXISTS ( SELECT 1
                   FROM user_personality UP2
                  WHERE UP2.user_id = user.user_id
                    AND UP2.personality_id <> '2' 
               )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...