2016-12-14 4 views
0

私はクエリを実行するのが好きなmysqlテーブルを持っています。私のテーブルには、次のようになります。PHP "配列クエリ" /複数のクエリ

 
    date  activity amount 
    -------- ------  -------- 
    day 1  drink  0 
    day 1  eat   1 
    day 1  breath  1 
    day 2  drink  0 
    day 2  eat   0 
    day 2  breath  0 
    day 3  drink  1 
    day 3  breath  0 
    day 4  eat   1 
    etc   
    etc   
    etc   

私は何をしたいのですが1で食べ、事実である日、私はそれらの日のためにすべての活動を表示したい時に見ることです

 
//What I was doing right now is: 

$activityarray = array(); 



$result = mysql_query("SELECT * FROM table WHERE activity='eat' AND amount='1'"); 
$row = mysql_fetch_assoc($result); 

//this returns all rows where activity=eat and amount=1 


do{ 
    //perform for each result row a new query; look for the 'date'=$row[date] from the first query and show all activities that have been done that day (activity=1) 

    $result2 = mysql_query("SELECT * FROM table WHERE date='".$row[date]."'"); 
    $row2 = mysql_fetch_assoc($result2); 

    do{ 
     array_push($activityarray,$row2['activity']); 
    }while($row2 = mysql_fetch_assoc($result2)); 

}while($row = mysql_fetch_assoc($result)); 


print_r($activityarray); 

1日に何千ものアクティビティが数多くあるので、これは私にとって最も効率的な方法ではないようです。 1つのクエリでこれをより効率的に行う方法はありますか? (だから、食べる日のすべての活動をチェックする= 1)。 誰でも私を私にすることができます!

+0

somethignを= '食べる'そして量= '1') ' –

+1

@ダゴンそれは'どこの日に... 'であるべきです – Barmar

+0

ああ、うん、それはちょっと速かった –

答えて

1

自己結合を使用します。

SELECT t1.* 
FROM table AS t1 
JOIN table AS t2 ON t1.date = t2.date 
WHERE t2.activity = 'eat' AND t2.amount = 1 
+0

これを試すと、次のメッセージが表示されます。 SELECTはMAX_JOIN_SIZE個以上の行を調べます。あなたのWHEREを確認し、SELECTを使用して SQL_BIG_SELECTS = 1またはSET MAX_JOIN_SIZE = SELECTを使用してください。 – mh3982

+0

'date'カラムにインデックスを追加してみてください。 – Barmar

+0

どうすればいいですか?クエリーはどのように見えるようになりますか? – mh3982

0

私の提案、あなたがサイズ制限に加入している場合は特に:1日=は(どこ活動から日を選択するには、表SEL​​ECT * FROM `のような

select * 
from table as t1 
where exists (
    select 1 
    from table as t2 
    where t2.date = t1.date 
    and t2.activity = 'eat' 
    and t2.amount = 1 
    )