2012-04-13 3 views
1

У меня есть три таблицы:У вас есть такой запрос в SQL?

tbl_customers 
tbl_users 
tbl_reviews 

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

SELECT 
    * 
FROM 
    tbl_customers 
WHERE 
    tbl_customer.CustomerID != tbl_review.CustomerID 
    AND tbl_user.UserID != tbl_reviews.UserID 
  • CustomerID является p_id для tbl_customer
  • идент p_id для tbl_users.
  • Отношение внешних ключей для обоих из них в tbl_review.

Заранее спасибо.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

+0

Можете ли вы разместить некоторые данные образца и желаемый o/p – Teja

+0

Вы хотите запрос или ограничение db для tbl_reviews, например 'unique (customer_id, user_id)' – dotjoe

+0

Не могли бы вы уточнить, какие результаты вы хотите? Вы хотите получить полный список всех пользователей с одним обзором клиентов для каждого пользователя? Вы пытаетесь не дать клиенту неоднократно просматривать один и тот же пользователь? Если нет, я не понимаю, почему вы хотите заблокировать несколько обзоров этого пользователя от одного и того же клиента, поскольку они могут быть ценными. Они могут иметь несколько взаимодействий с этим пользователем и хотят каждый раз проверять его/ее. –

ответ

4

Положите уникальное ограничение на таблицу tbl_reviews, которая использует обе колонки. Это полностью исключает несколько записей, которые позволят вам выполнить простое соединение. Вам просто нужно добавить подтверждение для добавления записи, чтобы она не выходила из системы, когда пользователь пытается ввести более одного отзыва для одного и того же человека.

alter table tbl_reviews add unique index(reviewid, userid); 

select * 
from tbl_users as u 
join tbl_reviews as r on r.userid = u.userid 
-1
SELECT * FROM 
tbl_users tu 
INNER JOIN 
tbl_reviews tr 
ON tu.UserID=tr.UserID; 
+1

Не используйте подразумеваемый синтаксис. это антипаттерн SQL, и мы пытаемся заставить людей изучить лучшие методы, а не самые худшие. – HLGEM

1

Если вы не хотите tbl_customer когда-либо иметь несколько обзоров по тому же tbl_user, то вы можете создать уникальный индекс для tbl_review, основанного на CustomerID и UserID. Это гарантирует, что нет возможности, чтобы у вас было два отзыва с одинаковой связью.

Кроме того, что вы можете сделать простой подсчет, чтобы увидеть, если обзор уже существует, прежде чем отправлять: SELECT COUNT(*) FROM tbl_reviews WHERE CustomerID = @CustomerID AND UserID = @UserID

Если вы говорите, что вы хотите иметь несколько обзоров в базе данных, но только выбрать один из каждого клиента, то вы просто захотите группировать по идентификатору клиента и выбрать первый/последний обзор.

1

Я согласен с идеей уникального ограничения. Я хочу добавить, что в SQL Server (и, возможно, других dbs) вы можете использовать оператор MERGE вместо INSERT, и он либо обновит существующую запись, либо добавит новую. Тем не менее, вы можете просто проверить, есть ли обзор, если он спрашивает их, хотят ли они обновить его. Сделайте это до того, как человек сделает больше, чем просто указать пользователя, на который включен обзор, чтобы они могли вызвать существующий обзор и вносить изменения, а не переписывать все.

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