2012-01-25 10 views
1

2つのMySQL関数は、それぞれ独立して動作しますが、ランダムな結果を返します。これらの2つのクエリを考えてみましょう:2つのMySQL関数が独立して動作しますが、結合されていない場合(RAND()?)

SELECT * FROM table_categories WHERE id = 8

クエリ2

私のテーブルの設定によると、この一貫:

クエリ1

は、これは明らかにid=8行を私に返します1〜16の数値を返します。

奇妙なこと

組み合わさ

SELECT cat.id FROM table_categories cat 
LEFT JOIN table_user_to_category u2c 
ON u2c.cat_id = cat.id AND u2c.user_id = 0 
ORDER BY IFNULL(u2c.count,0), RAND() LIMIT 1 

、これは時には、時には何、時には3、2行を返さない、table_categoriesから行を返します。何が一体?

SELECT * FROM table_categories WHERE id = (
SELECT cat.id FROM table_categories cat 
LEFT JOIN table_user_to_category u2c 
ON u2c.cat_id = cat.id AND u2c.user_id = 0 
ORDER BY IFNULL(u2c.count,0), RAND() LIMIT 1) 

これはRAND()のためですか?私はそれを把握することはできません!私には奇妙な行動があるように見えますが、私は相対的な初心者です。

+0

ちょっとしたアドバイス。このようなクエリを大量に読み込んだテーブルに対して実行すると、データベースが無駄になります。 RAND()は耐性があります。 –

+0

@MikePurcell、大いに読んでいるテーブルのための良いアドバイス、私の場合はありません。めったに読み込まれず、サブクエリが10行ほど返します。これを見てください:http://stackoverflow.com/questions/4710048/good-idea-bad-idea-using-mysql-rand-outside-of-a-small-set-of-subquery-result – Kyle

答えて

0

確かにidUNIQUEまたはPRIMARY KEYと定義されていますか?それ以外の場合は、同じIDを持つ複数の行を簡単に持つことができます。これらの行は、乱数が選択するとすべて返されます。

+0

はい、 'id' 'table_categories'にはPRIMARY KEYがあります。 | id | int(11)| NO | PRI | 0 | | – Kyle

+0

これが重要な場合は、 'table_user_to_category'の' user_id'と 'cat_id'には一意の索引が結合されています。 – Kyle

+0

また、この回答をコメントであふれさせるのではなく、たとえそうであっても、結果が乱数で返ってくるのは奇妙なことではないでしょうか? – Kyle

関連する問題