2012-09-24 42 views
0

我遇到以下問題。假設我有一個包含汽車的庫存表:IN中的MYSQL元組因通配符匹配而暫停

VIN, MAKE, MODEL, PRICE 

和我有一個包含各種汽車類(例如,緊湊型,中型,SUV等)

MAKE, MODEL, CLASS 
JEEP, NULL , SUV 
FORD, EXPLORER, SUV 
TOYOTA, YARIS, COMPACT 
NULL, CUBE, COMPACT 
... 

我想知道另一個表我如何選擇某個班級的數據庫中的所有車輛?也許,我想知道每班有多少輛汽車存在?

我可以寫這樣的查詢。

SELECT COUNT(*) FROM CARS WHERE (MAKE, MODEL) IN (SELECT MAKE, MODEL FROM CLASSES WHERE CLASS = 'SUV') 

這裏的問題,我不會居然能應對我的數據爲NULL。我想說的是,所有JEEP車型都是SUV,或者任何稱爲CUBE的MAKE車都是緊湊型車。

這樣做可以假設沒有衝突嗎?我能有一個優先級設置,像所有的門廊是,除了這是做這樣的事情的SUV卡宴車:

MAKE, MODEL, CLASS 
PORCHE, NULL , CAR 
PORCHE, CAYENNE, SUV 

如果這是不可能的MySQL,有沒有更好的DB技術在那裏那會很好。讓我們假設CLASSES表將包含50K +行,而CARS表將包含5M +行。我正在尋找一種在數據庫中執行這種查詢的快速方法,而不需要獲取數百萬行來處理腳本?另外,如果它不只是品牌和型號,而且還有子型號,發動機等。

另外,我簡化了一些數據,有4個層次的層次結構。

回答

1

假設品牌和型號不能同時null給定類。你可以在MySQL中使用ifnull()功能:

select cl.class, count(*) 
from cars c inner join class cl 
    on c.make = ifnull(cl.make,c.make) 
    and c.model=ifnull(cl.model,c.model) 
group by cl.class 

您可能要加上makesmodel的索引以便快速訪問。由於classes使用內部聯接的行數較少(如上所述)會限制返回的行數。

1

你可以寫你的查詢是這樣的:

SELECT COUNT(*) 
FROM CARS c join 
    classes cl 
    on (c.make = cl.make or cl.make is null) and 
     (c.model = cl.model or cl.model is null) and 
     cl.class = 'SUV' 

的問題是,你可能會得到重複。所以更好的計數開始於:

select count(distinct c.vin) 
. . . 

這應該適用於您給出的兩種情況,即JEEP和CUBE。

0

SELECT s.class,COUNT(*)FROM 車C,car_class小號 WHERE c.make = s.make AND c.model = s.model GROUP BY s.class

應該給你像

SUV 14 COMPACT 32 TRUCK 11 等