2016-06-29 2 views
0

私は高度なMySQLクエリのものに熟練していません。(主に基本的なクエリ、返信、解析応答など)複数のクエリまたは1つで実行できますか?

しかし、私は複数のものが必要なときに正しいアプローチでは不明ですこれらのことを単一のクエリから取得する方法はありますか?または毎回新しいクエリを実行する必要がありますか?

背景:私は、SELECT文

すなわちを行うにはPDOを使用し :

$getAllVideos_sql = "SELECT * as FROM $tableName WHERE active IS NOT NULL OR active != 'no' ORDER BY topic, speaker_last, title;"; 
$getAllVideos_stmt = $conn->prepare($getAllVideos_sql); 
$getAllVideos_stmt->execute(); 
$getAllVideos_stmt->setFetchMode(PDO::FETCH_ASSOC); 
$results = $getAllVideos_stmt->fetch(PDO::FETCH_ASSOC); 

//parse as I see fit 

これは私が離れて選ぶと、私が望むように表示することができ、私のデータのチャンク」を提供します。

は、しかし..私はまた、(すべて一意である必要があるのタイトル "のためにいくつかの統計情報(合計)合計

(明確な)「トピック」..だけでなく、トータルカウントを与えることができるようにしたいです

別のクエリを実行し、準備し、実行し、setFetchModeして、もう一度フェッチする必要がありますか?

これは適切な方法ですか?あるいは、既にプレイ中の最初のコマンドを受け入れる方法がありますか?

明確にするために、私は本当にクエリを探していません...私は私のようにいくつかのデータが必要なときに、これを行う正しい方法を理解していますか?複数のクエリと実行...など?

それとも、1つのスニペットで行うことができますか?サブ選択/クエリ情報を返すためのクエリ自体の調整?

  • それだけで1つのレコードを返しますので、これは...、正しい構文をイマイチ(ただし、総トピック数は、私が唯一の1つのレコードが返されますにもかかわらず、正しいように思える)

    SELECT *、カウント数( DISTINCTトピック)totalTopicsとして、totalTitles FROM $ tableNameとしてcount(DISTINCT title)を指定します。

もっと適切なアプローチですか?主なクエリにこれらの合計/詳細を含めて試してみてください。

希望はこれが理にかなっています。

答えて

1

私はあなたがそれがこれをやるものは非常にきれいな取得するつもりだ、しかしこのような何かがうまくいくかもしれないとは思わない: `* SELECT、(:ここ

SELECT * from $Table t 
INNER JOIN (
    SELECT COUNT(DISTINCT Topic) as TotalTopics FROM $Table 
) s ON 1 = 1 
INNER JOIN (
    SELECT COUNT(DISTINCT Title) as TotalTitles FROM $Table 
) f ON 1 = 1 
WHERE (Active IS NOT NULL) AND Active != 'no' 
+0

返事ありがとうございます。これは、JOINSなしで更新されたクエリ(私は構文エラーがありました)を使用しているようです.. '$ getAllVideos_sql =" SELECT *(SELECT count(DISTINCT(トピック))FROM $ tableName WHERE active = ' (アクティブ) ')totalTitles FROM $ tableNameアクティブなIS NOT NULLまたはアクティブ='アクティブな 'ORDER BYのトピック、speaker_last、title; "activeTopics"としてのtotalTopics、(SELECT count(DISTINCT(タイトル))FROM $ tableName WHERE active = ; ' しかし、サブクエリの-as-値をターゲットにすることはできません。 例:$ results ['totalTopics'] クエリからこれらの値を取得するにはどうすればよいですか? – whispers

+0

情報をどのように取得するかによって、$ resultsは期待している構造にない可能性があります。 'var_dump($ results)'を試して、$結果に戻ったものを見てください。 –

0

特にWebアプリケーションと

おかげで、多くの人が定期的にどこかの道に沿ってカウントまたは他の集計を行っています。場合によっては、すべてのユーザーのすべてのトピックなどのグローバルなコンテキストの場合、保存された集計をいくつか保持すると、毎回すべてのレコード数を再クエリするのではなく、役立ちます。

例。 「トピック」のリストを含む表がある場合は、そこにuniqueTitleCountの列があります。次に、トリガに基づいて、新しいタイトルがトピックに追加されると、カウントは自動的に1を加算することによって更新されます。この列には、「トピック」テーブルに対する相関更新を行い、トリガが設定すると、その列を持つことができます。

これは、私が人々が「最新の」ものを望んでいることを何度も見ているようにも機能します。あなたのシステムがテーブルに自動インクリメントIDを持っている場合は、同様に、特定のトピックに対して最新のIDを作成するか、特定のタイトル/ドキュメント/スレッドについて最新のIDを作成します。

select documentID, other_stuff 
    from sometable 
    where documentID in (select max(documentID) 
          from sometable 
          where the title = 'something') 

最適なプルダウンが扱いやすくなるような場所でこれらを使用してください。ドキュメント「タイトル」と最も最近の投稿日付ごとにカウンタを持つこともできるので、関心や活動の頻度などに基づいてすぐにソートすることができます。

+0

が私の現在の試みですSELECT count(DISTINCT(タイトル))as totalTitles FROM $ tableName WHERE active = 'Active')FROM $ tableNameはアクティブなIS NOT NULLです。 ORアクティブな「アクティブ」ORDER BYトピック、speaker_last、タイトル;「 ただし、$結果をループすると...各行の最後に表示されます。 – whispers

+0

続き: 'foreach($結果は$ key => $ value){' ....など ............. 'アクティブ:アクティブ(SELECT count(DISTINCT(topic)) (アクティブ) '):76' キーの代わりにvimeo_videosからvimeo_videosからtotalTitles FROM vimeo_videos WHERE active = 'アクティブ'):16(SELECT count(DISTINCT ?サブクエリテキストの名前を持つ「キー」からこれらの値にアクセスするにはどうすればよいですか? – whispers

+0

@whispers、このようなコメントはしないでください。オリジナルの投稿を編集して、そこに詳細を入れてから、ちょっとしたコメントがありますね。更新された投稿を確認してください(または同様のもの)。それ以外の場合は、書式設定の利点やその他の利点が失われ、使用可能な詳細の進捗状況が表示されます。 – DRapp

関連する問題