2015-03-24 49 views
0

SQL查詢DISTICT:查詢指望在多個表的字段不工作

Select count(distinct signature) 
from (Select table_name 
     from information_schema.tables 
     where table_schema="Log" and table_name like "%ERROR_%") 
AS mytable; 

預期輸出:所有表中獨特的「簽名」的數量。

實際產出:'字段列表'中的未知列「簽名」;

注:我所有的表簽名ASA字段名

+0

有趣的是,我希望輸出是像「語法錯誤:簽名未定義」的東西。也許你應該用樣本數據和期望的結果來編輯你的問題。 – 2015-03-24 23:04:25

+0

是的,當我改變一些語法時,這也是一個錯誤。儘管如此,所有的m表都有簽名。 – Amber 2015-03-24 23:05:20

+0

我懷疑你需要使用動態SQL來做你想做的。對'prepare'和'exec'做一些研究。 。 。您無法從查詢中獲取表名並期望在同一查詢中獲取表的內容。 – 2015-03-24 23:08:38

回答

0

貌似你試圖在MySQL端的動態查詢。請檢查這...

-- Step1. prepare your select query here 
set @sqlQuery := 
(select 
GROUP_CONCAT(
    concat(' SELECT \'',table_name,'\' as col1, COUNT(*) as countItem FROM ', table_name) 
    SEPARATOR ' UNION ALL ' 
) from information_schema.tables as t 
where t.table_schema="Log" and t.table_name like "%ERROR_%"); 

-- Step2. execute the dynamic query 
prepare stmt from @sqlQuery; 
execute stmt; 
drop prepare stmt; 
0

那麼,你的子查詢開始了這樣的:

Select table_name from information_schema.tables 

讓你在被拉動將可在單一列「表格名」。

因此,如果您嘗試從該子查詢中選擇簽名,它會告訴您沒有這樣的列。

你可能想要做這樣的事情(僞代碼):

query(
    Select table_name 
    from information_schema.tables 
    where table_schema="Log" and table_name like "%ERROR_%" 
) 
$sql = ''; 
$sep = ''; 
while ($row = fetch_assoc()) { 
    $sql .= $sep."SELECT signature FROM $row[table_name] "; 
    $sep = 'UNION ALL '; 
} 
$sql = "SELECT COUNT(DISTINCT signature) as c FROM ($sql)"; 
query($sql); 
$row = fetch_assoc() 
echo "There are $row[c] distinct signatures.<br />\n";