Я застрял на моем сватовском сайте.Это как 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