2017-12-25 5 views
1

グループを表示すると、ユーザーがページを開いたときに2つのグループをランダムに表示する必要があります。 5.7「ONLY_FULL_GROUP_BY」SQL_MODEためオプションを使用しているため、そうではないのMySQL 5.7で多くのために働くことによって罰金が、ワーキンググループ次のクエリでは使用しています。 "GROUP BY"のほかに、あなたが提案できる他のクエリフォーマットがありますか?ユーザIDにloged場合($uidグループの所有者ではないgroup_usersF.group_user_id <> '$uid'5.7ではSQL_MODEに "ONLY_FULL_GROUP_BY"オプションが使用されているため、GROUP BYはMySQL 5.7で多数動作しません。

を接合

ユーザID($uidにloged場合クエリ

として示されなければならないが、されていません(グループ作成者)グループG.group_owner_id <> '$uid'。すでにSELECT DISINCTを使用していることを考えると

$query = mysqli_query($this->db,"SELECT DISTINCT 
G.group_id, 
G.group_owner_id, 
G.group_name, 
G.group_title, 
G.group_cover, 
F.group_oid, 
F.group_user_id 
FROM groups G, 
group_users F 
WHERE G.status ='1' AND 
G.group_id = F.group_oid AND 
G.group_owner_id <> '$uid' AND 
F.group_user_id <> '$uid' 
GROUP BY G.group_id 
ORDER BY rand() 
LIMIT 2 ") or die(mysqli_error($this->db)); 

enter image description here

+0

マニュアルを読んだら、GROUP BYを正しく書いてください。正しく動作すれば動作します。 – RiggsFolly

+0

@RiggsFolly私はそれができないので、私は助けが必要です。 – Azzo

+1

@Azzoあなたが 'SELECT DISTINCT'を使っているとすれば、あなたは望む結果を得るために必ず' GROUP BY'を使う必要はないと推測します。完全に削除するだけでなく、SELECT文のすべての列を 'GROUP BY'節に含めることができます。 –

答えて

5

、これはあなたもGROUP BYを使用する必要がないことを意味します。それを取り除くだけで、エラーは消えてしまいます。あなたも、列のいくつかの凝集体を選択した場合、我々が行うにはより多くの仕事を持っているだろうと

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
FROM groups G 
INNER JOIN group_users F 
    ON G.group_id = F.group_oid 
WHERE 
    G.status = '1' AND 
    G.group_owner_id <> '$uid' AND 
    F.group_user_id <> '$uid' 
GROUP BY 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
ORDER BY rand() 
LIMIT 2; 

注:あなたはDISTINCTが持っているでしょう効果をシミュレートするためにGROUP BYを使用したい場合は、単にGROUP BYすべての列をすることができます。次に、あなたが直面しているGROUP BY問題を回避するために、1つ以上のサブクエリを導入することになります。

+0

'DISTINCT'で列の集合を選択すると、それらの列に関して重複行が存在することはありません。私はあなたのデータに問題があることをかなり確信していますが、私は正確に何がわからないのです。おそらく、あなたはこのエッジケースのデータであなたの質問を更新し、それを解決しようとしましょう。 –

+0

最も簡単な方法では、 '$ uid' ** 4 **' group_id' ** ** 16 ** _two times_を見てください。 '$ uid' ** 4 **は' group_oid'に加わっていないので** ** group_users'テーブルのfrom – Azzo

+0

@Azzo厳密には2つのレコードの複製ではなく、 group_id値です。次に、これら2つのレコードのいずれかを選択するためのロジックを提供する必要があります。実際、サンプルデータと必要な出力を最小限に抑えることができればよいでしょう。 –

関連する問題