[英]Selecting distinct values from key/value pairs in a seperate table
我有2個數據庫表
JOBS(JOB_ID, JOB_TIME, JOB_NAME,...), JOB_PARAMETERS(JOB_ID,NAME,VALUE)
其中JOB_PARAMETERS本質上是一個包含作業參數鍵值對的映射。 每個作業可能具有唯一的參數鍵/值對。
我期待以實用的方式構建一個查詢,該查詢將返回包含鍵/值組合的不同作業ID。 其中值實際上是值列表,比較運算符。 例如:
JOB_PARAMETERS: NAME = 'OUTPUT_FILENAME', VALUE LIKE "ALEX%", "JAX%"
NAME = 'PRIORITY' , VALUE > 7
上面的示例將自動過濾掉所有沒有OUTPUT_FILENAME和PRIORITY鍵的作業。 返回滿足這兩個條件的所有工作。
我還需要能夠支持分頁和排序。
我計划將Perl與DBIx :: Class一起使用,但我也可以在純Perl / SQL中使用它。
我願意改變數據庫模式,但每個作業都可以有不同的鍵/值對,所以我不能只在job表中創建它們。
提前致謝。
可以在SQL中執行此操作,方法是將JOB_PARAMETERS
按JOB_ID
分組並相應地過濾組。 例如,如果(JOB_ID, NAME)
存在唯一性約束,則可以按如下方式進行查詢:
SELECT JOB_ID
FROM JOB_PARAMETERS
WHERE (NAME='OUTPUT_FILENAME' AND (VALUE LIKE 'ALEX%' OR VALUE LIKE 'JAX%'))
OR (NAME='PRIORITY' AND VALUE > 7)
GROUP BY JOB_ID
HAVING COUNT(*) = 2
如果沒有這樣的唯一性約束,則必須用COUNT(DISTINCT NAME)
替換COUNT(*)
COUNT(DISTINCT NAME)
。
使用DBIx :: Class時,可以使用Schema :: Loader生成DBIC模式。
連接到數據庫后,您將獲得一個$ schema對象,您可以使用該對象來過濾ResultSet以返回所需的Result對象:
my $rs_job_parameters = $schema->resultset('Job_Parameters')->search({
-or => [
{
'name' => 'OUTPUT_FILENAME',
'value' => [{ like => 'ALEX%'}, { like => 'JAX%' }].
},
{
'name' => 'PRIORITY',
'value' => [{ '>' => 7}].
}
]},
{
columns => [qw( job_id )],
group_by => [qw( job_id )], # alternative you can use distinct => 1 to group_by all selected columns
having => \[ 'COUNT(*) = ?', [ 2 ] ],
}
);
my @job_ids = $rs_job_parameters->get_column('job_id')->all;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.