ВЫБЕРИТЕ из одной таблицы, в то время как два условия НЕ ВЕРНЫ в другой таблице. Возможный? - PullRequest
0 голосов
/ 24 июля 2010

Я застрял на моем сватовском сайте.Это как eHarmony для супружеских пар, чтобы найти других пар, с которыми можно пообщаться.

Я пытаюсь быть хорошим rdba и использую миллион таблиц, а затем использую несколько сложных объединений, чтобы получить нужную информацию.Но я застрял на одном из последних.Я могу сделать это в коде, но я должен быть в состоянии сделать это в SQL.Вот предложение:

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

Теперь я показываю только 4 совпадения, поэтому я хочу, чтобы вы были в состоянии одобрить кого-то или одобрить его, а затем ониисчезают и заменяются кем-то другим.

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

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

SO, 

    I have these tables and I will list the columns that matter right now:

        couples 
        couples_id

        When a new person signs up, I recalculate the matches table,
    comparing every person with every other person and entering
    a compatibility quotient for each set of couples.:

        matches_couples
        matches_couples_couplea
        matches_couples_coupleb
        matches_couples_matchfactor
        (their compatibility number, I sort by this)

        When a person votes up or down on someone, 
    I enter a row for that vote.
 Who voted, about whom, and (a)ccepted or (r)ejected.:
        verdict_couples
        verdict_c_couplea (the person voting)
        verdict_c_coupleb (the person they're voting about)
        verdict_c_verdict (either 'r' for rejected or 'a' for accepted)

Итак, это мой текущий рабочий SQL:

SELECT
*

FROM
match_couples

WHERE
(match_couples_couple_a = '$couples_id'
or
match_couples_couple_b = '$couples_id')

ORDER BY
match_couples_matchfactor desc

LIMIT 4

Но он не учитывает голосование и покажет кому-тоВы отклонили, или кто уже отклонил вас, или вы одобрили.Я хочу лишить всех, кто отклонил вас, или вы отвергли, или кого вы одобрили.

В общем, если вы когда-либо были verdict_c_couplea, я не хочу включать в себя человека, который был парой, так как вы уже приняли решение о них.

И есливы verdict_c_coubleb, и это 'r' для отклонения в verdict_c_verdict, я тоже не хочу показывать этого человека.

ТАК, я хочу какое-то очень сложное предложение JOIN или вложенное выражение EXISTS или что-то, что лишает ихлюдей (таким образом, мой LIMIT 4 по-прежнему работает.

ЕСЛИ НЕТ, метод грубой силы - снять ограничение, затем для каждого из этих людей, сделанных выше, сделать второй вызов SQL, чтобы проверить таблицу вердиктов.прежде чем позволить им стать частью окончательного списка. Но я надеюсь, что это серьезное препятствие.

Мне удалось получить СЧЕТ количество раз, когда вы утвердили пару, и они также одобрили вас- полное совпадение. Я думаю, что ответ на поставленный выше вопрос скрыт в этом подсчете числа рабочих совпадений SQL, но я даже не могу поверить, что он заставил его работать:

SELECT COUNT( * ) AS matches
FROM (
verdict_couples t1
)
JOIN (
verdict_couples same
) ON ( (
t1.verdict_c_couplea = same.verdict_c_coupleb
)
AND (
same.verdict_c_verdict = 'a'
)
AND (
t1.verdict_c_verdict = 'a'
) ) 
WHERE
    same.verdict_c_couplea = '$couples_id' 
    and 
   t1.verdict_c_coupleb = '$couples_id'

В основном ONпункт перекрещивается с предложением WHERE, потому что вы ищете:

id couplea pairb приговор 54 США ВЫ принимаете 78 ВЫ США принимаете

Это означает, что мы одобрили ВАС, а вы одобрили США.и удивительно, что работает.Где-то там есть смелость ограничить мой список матчей только теми людьми, за которых я еще не проголосовал и которые не отклонили меня.

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

Любая помощь по соединениям?

K

1 Ответ

1 голос
/ 24 июля 2010
SELECT *
FROM match_couples m
WHERE 
(m.match_couples_couple_a = '$couples_id'   # we are couple a
  AND m.matches_couples_coupleb NOT IN (    # couple b not in the list of couples which:
                                            # A. we have voted on before
                                        select verdict_c_coupleb 
                                        from verdict_couples
                                        where (verdict_c_couplea = $couples_id) 
                                        UNION
                                            # or B. have rejected us
                                        select verdict_c_couplea 
                                        from verdict_couples
                                        where (verdict_c_coupleb = $couples_id 
                                          AND verdict_c_verdict = 'r'))
OR
(m.match_couples_couple_b = '$couples_id'
  AND m.matches_couples_couplea NOT IN (select verdict_c_coupleb 
                                        from verdict_couples
                                        where (verdict_c_couplea = $couples_id) 
                                        UNION
                                        select verdict_c_couplea 
                                        from verdict_couples
                                        where (verdict_c_coupleb = $couples_id 
                                          AND verdict_c_verdict = 'r')
ORDER BY match_couples_matchfactor desc
LIMIT 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...