2010-12-28 4 views
0

がどのように私はPHPにわたしのこれらの2つのクエリのうち、唯一異なる値を取得することができます得ることができます:私は取得したいは、どのように私は2つの独立したSQLクエリのUNIONを取るだけDISTINCT値が

$query1 = "SELECT g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga 
        WHERE g.category >= 592 AND g.category <= 622 
         AND ga.affiliated_groups_hash = g.hash 
         AND LOWER(g.name) LIKE LOWER('%$school_name%') 
         "; 
     $query2 = "SELECT g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a 
        WHERE ga.affiliations_id = a.id 
         AND ga.groups_hash = g.hash 
         AND LOWER(a.name) LIKE LOWER('%$school_name%')"; 

をこれら両方のクエリからの別個の "g.hash"。私は両方のタスクを行うだろう1つのSQLクエリを持つことができればさらに良い。私のデータベーステーブルについて

詳細は、のように: c7_groups: ID int型(10)
名前はvarchar(255)
ハッシュVARCHAR(32) groups_categories_id int型(10) ビューはint(10)

c7_affiliationsのID INT(10) 名VARCHAR(100)
groups_categories_idはint(10)

c7_groups_affiliations groups_hash varchar(32)affiliated_groups_hash varchar(32)-------- FKey to c7_groups.hash
affiliations_id int(10)------------------- -FKeyが
のid INT(10)

をc7_affiliations.idするために、両方のaffiliated_groups_hash & affiliations_idはnullになる可能性があり、または私は1つを言うべきか、彼らは常にnullになります。グループが別のグループに所属する場合、affiliations_idはnullになり、グループが別の所属に所属している場合、affiliated_groups_hashはnullになります。

何かについての詳細が必要な場合はお知らせください。

よろしく Zeeshan

答えて

1

この

SELECT Distinct 
      g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga 
        WHERE g.category >= 592 AND g.category <= 622 
         AND ga.affiliated_groups_hash = g.hash 
         AND LOWER(g.name) LIKE LOWER('%$school_name%') 
UNION 
SELECT 
      g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a 
        WHERE ga.affiliations_id = a.id 
         AND ga.groups_hash = g.hash 
         AND LOWER(a.name) LIKE LOWER('%$school_name%') 
+1

あなたのコードを書式設定しました。私がしたことは、ステートメントを強調表示して{}ボタンを押すことでした。 –

2

ただ、派生テーブルにより、サブ選択して、グループ内の労働組合を行います。

select name,count(*) from 
(
       SELECT g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga 
        WHERE g.category >= 592 AND g.category <= 622 
         AND ga.affiliated_groups_hash = g.hash 
         AND LOWER(g.name) LIKE LOWER('%$school_name%') 
    UNION 
       SELECT g.name, g.hash, g.views 
        FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a 
        WHERE ga.affiliations_id = a.id 
         AND ga.groups_hash = g.hash 
         AND LOWER(a.name) LIKE LOWER('%$school_name%')"; 
) as myTbl 
group by name 
+0

を何が起こっているか、それは少し明確になりますされていません。 –

+2

実際には 'UNION ALL'がないと、既に別のものになっているはずです –

1

を試してみて最初のクエリと第二の唯一の違いは、参加がありますあるように思えます。おそらく、ANSI-92結合を使用した場合、このようになり、UNIONの必要はありません。

  SELECT DISTINCT 
        g.name, 
        g.hash, 
        g.views 
      FROM 
        c7_groups g 
        INNER JOIN c7_groups_affiliations ga 
        ON ga.affiliated_groups_hash = g.hash 
        LEFT JOIN c7_affiliations a 
        on ga.affiliations_id = a.id 

      WHERE 
       (LOWER(g.name) LIKE LOWER('%$school_name%') 
       AND g.category >= 592 AND g.category <= 622 
       AND a.ID is null) 
       OR 
       (LOWER(a.name) LIKE LOWER('%$school_name%') 
       and a.ID is NOT null) 

技術的には第二部でa.ID is NOT nullLOWER(a.name) LIKE LOWER('%$school_name%')がこれを行うため、必要が、それはあなたがまた `distinct`代わりの集計を使用することができます

+0

いいえ、あなたは1つの基準を見落としました。グループが他の所属と提携している場合、チェックする基準は「下位(a.name)LIKE LOWER( '%$ school_name%')」 –

+0

@ Zeeshan Rangです。ありがとう。それはちょっと奇妙なことに、それを少しはっきりさせる –

関連する問題