2012-03-20 6 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 */ 

私がこだわっているの作品!

** は、この不良少年は、私が投票していない時に1人のランダムなユーザーを吐き出すワーキングクエリ ****

/* 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; 

を更新しました!あなたの助けをありがとう、多くのaprpeciated!

あなたが想像していたように、私はランダムな人に投票しています。その人はwho_votedテーブルに入れて、ランダムなクエリを何も表示しません...私のコードを簡素化したいSQLの誰ですか?乾杯ミック

+0

あなたが言うvotes.idがNULL' IS WHEREあなたは '言う場所「に投票されていないすべてのユーザーの名前を表示する」のが、スキーマ内の最初のクエリidはnullではありませんか? –

答えて

0

1つの方法は、上記の最後のクエリをサブクエリとして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

素敵な返​​事をしてくれてありがとう、完璧ではありませんが、私たちは近くにいることを知っています!この悪い少年はリストを表示しますが、それはユーザーアカウントに固有のものではありません。私はWHを使うためにANDを追加する必要があると思います: '/ *まだ投票していないすべてのユーザーを表示*/ EXISTS、NOT WHERE ユーザーから unot.id、unot.name を選択するとUNOT( /*あなたは、全ユーザーのリストから投票したユーザーを除外します*/ SELECTは、ユーザーがAS uhave INNER FROM をuhave.id JOIN who_voted ON uhave.id = voted_on_user_id WHOT 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) 
関連する問題