2012-03-20 2 views
1

Я пытаюсь отобразить всех пользователей, на которых я еще не голосовал!Показать пользователей, которых я не проголосовал - MySQL

CREATE TABLE IF NOT EXISTS `users` 
(`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(200) COLLATE utf8_unicode_ci NOT NULL, 
`email` varchar(200) COLLATE utf8_unicode_ci NOT NULL,PRIMARY KEY (`id`) 
); 

CREATE TABLE IF NOT EXISTS `whose_voted` (
`voter_user_id` int(11) NOT NULL, 
`voted_on_user_id` int(11) NOT NULL, 
PRIMARY KEY (`voter_user_id`,`voted_on_user_id`) 
) 

CREATE TABLE IF NOT EXISTS `votes` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`yes_count` int(11) NOT NULL, 
`beer_count` int(11) NOT NULL, 
`total_votes` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) 

CREATE TABLE IF NOT EXISTS `user_votes` (
`users_id` int(11) NOT NULL, 
`votes_id` int(11) NOT NULL, 
PRIMARY KEY (`users_id`) 
) 

Я получил эту работу запроса:

/* Show the Names of all users that have not been Voted on */ 
SELECT users.name 
FROM users 
LEFT JOIN user_votes ON users.id = users_id 
LEFT JOIN votes ON votes_id = votes.id 
WHERE votes.id IS NULL 
ORDER BY users.name 

и этот запрос работает слишком

/* Show all the User Names that I have voted on */ 
SELECT users.id AS 'User ID', users.name AS 'I\'ve Voted On' 
FROM users 
INNER JOIN whose_voted ON users.id = voted_on_user_id 
WHERE whose_voted.voter_user_id = 32 /* my User ID */ 

Я застрял на показ пользователей, что я не голосовал на!

** Обновленный Рабочий запрос ****

/* Show a random users I have Not Voted For as of yet */ 
SELECT 
unot.id, unot.name 
FROM 
users AS unot 
WHERE NOT EXISTS (
/* Exclude the users you have voted on from the total user list */ 
SELECT uhave.id 
FROM users AS uhave 
    INNER JOIN whose_voted ON uhave.id = voted_on_user_id 
WHERE unot.id = uhave.id 
    AND (whose_voted.voter_user_id = 32) 
) 
AND (unot.id != 32) 
AND (RAND()<(SELECT ((1/COUNT(*))*10) FROM users)) 
ORDER BY RAND() 
LIMIT 1; 

Это плохой мальчик выплевывает 1 случайный пользователь, в то время, которое я не голосовал на! Спасибо за вашу помощь, много!

Как вы могли себе представить, я голосую за случайного человека, который появляется в таблице who_voted и, следовательно, ничего не показывает снова случайный запрос ... Любые гуру SQL, которые хотят упростить мой код? Cheers Mick

+0

Первый запрос на «Показать имена всех пользователей, которые не были Проголосовал на», где вы говорите 'WHERE votes.id IS NULL', но в схеме вы говорите id не равен нулю? –

ответ

0

Один из методов заключается в использовании WHERE NOT EXISTS с последним запросом выше в качестве подзапроса. Конечно, непроверенный, но должен работать.

SELECT 
    users.id AS `User ID`, users.name AS 'I\'ve not Voted On' 
FROM 
    users unot 
WHERE NOT EXISTS (
    /* Exclude the users you have voted on from the total user list */ 
    SELECT users.id AS 
    FROM users uhave 
    INNER JOIN whose_voted ON users.id = voted_on_user_id 
    WHERE whose_voted.voter_user_id = 32 /* my User ID */ 
     AND unot.id = uhave.id 
) 

NOT EXISTS подзапрос, вероятно, будет медленнее, чем JOIN хотя. Опять же, непроверенный.

SELECT 
    users.id AS `User ID`, 
    users.name AS 'I\'ve not Voted On' 
FROM 
    users unot 
    LEFT JOIN (
    SELECT users.id AS 
    FROM users uhave 
    INNER JOIN whose_voted ON users.id = voted_on_user_id 
    WHERE whose_voted.voter_user_id = 32 /* my User ID */ 
) uhave ON unot.id = uhave.id 
/* NULL in the have voted subquery indicates user hasn't been voted on. */ 
WHERE uhave.id IS NULL 
+0

привет, ребята, спасибо за быстрые ответы, это не идеально, но я знаю, что мы близки! Этот плохой мальчик запроса показывает список, но он не является специфическим для учетной записи пользователя. Я думаю, нам нужно добавить AND, чтобы перейти с WHERE: '/ * Показать всех пользователей, которых я еще не проголосовал На данный момент */ ВЫБРАТЬ unot.id, unot.name оТ пользователей AS unot ГДЕ НЕ СУЩЕСТВУЕТ ( /* Исключение пользователей вы проголосовали на из общего списка пользователей */ ВЫБРАТЬ uhave.id оТ пользователей AS uhave ВНУТРЕННИХ JOIN, who_voted ON uhave.id = voted_on_user_id WHERE unot.id = uhave.id ) ' –

0

Возможно, я просто упростил его, не так ли?

SELECT users.name 
FROM users 
LEFT JOIN whose_voted ON users.id = voted_on_user_id 
WHERE whose_voted.voter_user_id != 32 
0

Попробуйте этот запрос

$yourId=7; 

SELECT id,users.name 
FROM users 
where id not in 
(select distinct(voted_on_user_id) 
from whose_voted 
where voter_user_id =$yourId)