3

クエリを作成するには、皆さんの助けが必要です。

例。会社 - レンタカー

表 - 車

ID  NAME       STATUS
1   Mercedes   Showroom
2   Mercedes   On-Road

では、このテーブルから次の条件を満たすエントリを 1 つだけ選択するにはどうすればよいでしょうか。

  1. Mercedes が Showroom にある場合は、その行のみをフェッチします。(つまり、上記の例の行 1)

  2. ただし、ショールームにメルセデスがまったくない場合は、いずれかの行をフェッチします。(つまり、列 1 または列 2) - (これは、すべてのメルセデスがオンロードであると言っているだけです)

ID も select ステートメントでフェッチされるため、distinct を使用してもここでは役に立ちません。

ありがとう!

4

4 に答える 4

3

その問題を解決する一般的な方法は次のとおりです。

SELECT *,
CASE STATUS
WHEN 'Showroom' THEN 0
ELSE 1
END AS InShowRoom
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY InShowRoom
LIMIT 1

すべての車を取得する方法は次のとおりです。これは、問題を解決する別の方法も示しています。

SELECT ID, NAME, IFNULL(c2.STATUS, c1.STATUS)
FROM Cars c1
LEFT OUTER JOIN Cars c2
ON c2.NAME = c1.NAME AND c2.STATUS = 'Showroom'
GROUP BY NAME
ORDER BY NAME
于 2010-06-20T15:53:20.047 に答える
3

FIND_IN_SET()関数を使用してそれを行う必要があります。

SELECT *
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESC
LIMIT 1

他のステータスの優先順位がある場合は、それらを 2 番目のパラメーターに追加するだけです。

ORDER BY FIND_IN_SET(`STATUS`,'On-Road,Showroom' ) DESC

すべての車の「最高」ステータスを取得するには、次のようにします。

SELECT *
FROM Cars
GROUP BY NAME
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESC
于 2010-06-20T15:59:47.970 に答える
1
SELECT * FROM cars 
  WHERE name = 'Mercedes' 
  AND status = 'Showroom' 
UNION SELECT * FROM cars 
  WHERE name = 'Mercedes' 
LIMIT 1;

編集とにかく個別の行のみが必要なため、UNION の ALL を削除しました。

于 2010-06-20T15:18:16.297 に答える
0

MySQL にはランキング/分析/ウィンドウ関数はありませんが、変数を使用して ROW_NUMBER 機能をシミュレートできます (「--」が表示されている場合はコメントです)。

SELECT x.id, x.name, x.status
  FROM (SELECT t.id,
               t.name,
               t.status,
               CASE 
                 WHEN @car_name != t.name THEN @rownum := 1 -- reset on diff name
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @car_name := t.name -- necessary to set @car_name for the comparison
          FROM CARS t 
          JOIN (SELECT @rownum := NULL, @car_name := '') r
      ORDER BY t.name, t.status DESC) x  --ORDER BY is necessary for rank value
 WHERE x.rank = 1

ステータス順 DESC は「ショールーム」がリストの一番上になることを意味するため、1 とランク付けされます。車名に「ショールーム」ステータスがない場合、1 番目にランク付けされた行はどのステータスでもかまいません。 「ショールーム」の後に続きます。WHERE 句は、テーブル内の各車の最初の行のみを返します。

ステータスがテキスト ベースのデータ タイプであるということは、データが正規化されていないことを示しています。「Showroom」、「SHOWroom」、および「showROOM」を含むレコードを追加できます。それらは有効ですが、カウント、合計などのために物事をグループ化するときに LOWER & UPPER などの関数を使用することを検討しています。関数を使用すると、列のインデックスも役に立たなくなります... CAR_STATUS_TYPE_CODE テーブルを作成することを検討し、外部キー関係を使用して、不適切なデータがテーブルに入らないようにします。

DROP TABLE IF EXISTS `example`.`car_status_type_code`;
CREATE TABLE  `example`.`car_status_type_code` (
  `car_status_type_code_id` int(10) unsigned NOT NULL auto_increment,
  `description` varchar(45) NOT NULL default '',
  PRIMARY KEY  (`car_status_type_code_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
于 2010-06-20T16:45:57.613 に答える