2011-01-10 3 views
0

Предполагается, что у нас есть классы Person, Character и PersonCharacter и их соответствующая структура в следующей структуре данных и данных в базе данных MySQL.Условия SQL AND/OR для двух таблиц

table persons 
[ 
    { id: 1, name: peter }, 
    { id: 2, name: mary }, 
    { id: 3, name: joe }, 
    { id: 4, name: paul }, 
    { id: 5, name: may }, 
] 

table characters 
[ 
    { id: 101, description: cheerful }, 
    { id: 102, description: nervous }, 
    { id: 103, description: greedy }, 
    { id: 104, description: sincere }, 
    { id: 105, description: naive }, 
    { id: 106, description: firm }, 
] 

table person_characters 
[ 
    {id: 1000, person_id: 1, character_id: 101}, 
    {id: 1001, person_id: 1, character_id: 103}, 
    {id: 1002, person_id: 1, character_id: 106}, 
    {id: 1003, person_id: 2, character_id: 102}, 
    {id: 1004, person_id: 2, character_id: 104}, 
    {id: 1005, person_id: 3, character_id: 102}, 
    {id: 1006, person_id: 3, character_id: 105}, 
    {id: 1007, person_id: 4, character_id: 104}, 
    {id: 1008, person_id: 5, character_id: 101}, 
    {id: 1009, person_id: 5, character_id: 106}, 
] 

Как я могу написать SQL заявление, если это возможно с помощью Rails, который можно узнать, что с людьми, которые имеют определенные символы? Например, люди с характером, как твердые, так и веселые, могут и peter.

Вопрос кажется типичным, но трудно найти ответ поисковыми системами.

+0

Вы уже знаете идентификатор «character» или wou Вам нужно это посмотреть? [Это, по сути, запрос JOIN, но для перехода к перекрестной ссылке на идентификатор символа, если у вас его еще нет, вам нужно будет пройти глубже.] –

+0

Мне нужно было бы это посмотреть. – OmniBus

+0

'PersonCharacter' не является очень значимым именем элемента данных, IMO. Как насчет «Личности»? – onedaywhen

ответ

0
SELECT persons.* 
FROM persons 
    JOIN person_characters 
    ON person_characters.person_id ON persons.id 
    AND 
     -- vvv Method one, we already have the character IDs: vvv 
     person_characters.character_id IN (101,106) 
     -- ^^^ /Method one ^^^ 

     -- vvv Method two, we need to look them up vvv 
     person_characters.character_id IN (
     SELECT characters.id 
     FROM characters 
     WHERE characters.description IN ('cheerful','firm') 
    ) 
     -- ^^^ /Method two ^^^ 

Примечание использовать только один из этих заявлений после того, как и внутри объединения. Я просто показываю любой подход (если вы делаете или не иметь идентификатор (ы) символов (ы) для поиска.

0

лиц, которые имеют особые символы?

One черта характера в запросе или несколько (например, «лица, которые являются как„нервной“и" фирма»)?

Если несколько, положить параметры («нервной»и«фирма») в таблице затем использовать relational division.

Смежные вопросы