1

同じ列から同じ WHERE 条件を使用して、複数の部分文字列の出現回数をカウントしたいと考えています。部分文字列ごとに、繰り返しの WHERE 条件を含む UNION SELECT ステートメントがあります。最終結果は、appox を含むクエリです。2500 行の SQL コードですが、良い結果が得られます。

クエリの簡略化された例:

SELECT ‘be’ AS country, count(destination) FROM demo
WHERE destination LIKE ‘%be%’ AND field_a=xzx AND field_b=bbb

UNION SELECT ‘de’ AS country, count(destination) FROM demo
WHERE destination LIKE ‘%de%’ AND field_a=xzx AND field_b=bbb

UNION SELECT ‘fr’ AS country, count(destination) FROM demo
WHERE destination LIKE ‘%fr%’ AND field_a=xzx AND field_b=bbb

UNION SELECT ‘nl’ AS country, count(destination) FROM demo
WHERE destination LIKE ‘%nl%’ AND field_a=xzx AND field_b=bbb

クエリで WHERE 条件が 1 回だけ現れるようにクエリを変更することはできますか?

このリンクから私の質問の簡単な例を見つけてください:

https://docs.google.com/document/d/1otjZZlBy6au5E2I7T6NdSYmLayhNGWyXGxGo3gBx_-w/edit

4

3 に答える 3

1

コンマ区切りの値を 1 つのフィールドに格納しないでください。代わりに、多対多の関係テーブルを使用して、行ごとに (id,country) の組み合わせを 1 つ格納します。データ構造は SQL アンチ パターンであり、すべてのリレーショナル データベース設計原則に反します。

CREATE TABLE map (
  demo_id INT,
  country VARCHAR(2),
  PRIMARY KEY (demo_id, country)
)

INSERT INTO map VALUES
  (1, 'nl'), (1, 'de'), (1, 'be'), (1, 'fr'),
  (2, 'de'), (2, 'fr'), (2, 'be'),
  (3, 'fr'), (3, 'nl'),
  (4, 'nl')

次に、この単一のクエリがあります...

SELECT
  map.country,
  COUNT(*)
FROM
  demo
INNER JOIN
  map
    ON map.demo_id = demo.id
WHERE
      demo.field_a = 'xzx'
  AND demo.field_b = 'bbb'
于 2012-07-06T09:26:46.850 に答える
1
select a.country,count(*) from
(
select 'be' as country
union all
select 'de' as country
union all
select 'fr' as country
union all
select 'nl' as country
)a join demo d
on d.destination like '%'+a.country+'%'
AND d.field_a=xzx AND d.field_b=bbb
group by a.country

mySQL が派生テーブルをサポートしているかどうかはわかりません。サポートされていない場合は、すべて異なる国の値で一時テーブルを作成し、上記のクエリのテーブル a に置き換える必要があります

于 2012-07-06T09:36:37.810 に答える
0

使用するCOUNT CASE WHEN ... THEN ... END

SELECT 
COUNT(CASE WHEN destination LIKE "%be%" THEN 1 ELSE NULL END) AS "BE",
COUNT(CASE WHEN destination LIKE "%fr%" THEN 1 ELSE NULL END) AS "FR",
COUNT(CASE WHEN destination LIKE "%de%" THEN 1 ELSE NULL END) AS "DE",
COUNT(CASE WHEN destination LIKE "%nl%" THEN 1 ELSE NULL END) AS "NL"
FROM demo
WHERE field_a = "xzx" AND field_b = "bbb"

ただし、テーブルの構造を変更することを真剣に検討する必要があります。単一のフィールドにカンマ区切りの値を含めることは、実際には推奨されません。

代わりに、たとえばここでは、各旅行の ID を用意する必要があります (または、目的地フィールドのために旅行と言いました)。次に、この旅行の目的地ごとにエントリを作成します。この種の構造では、次のようなリクエストがあります。

SELECT destination, COUNT(id) 
FROM demo 
WHERE field_a = "xzx" AND field_b = "bbb" 
GROUP BY destination
于 2012-07-06T09:21:24.367 に答える