2013-08-05 41 views
0

我想查詢一個MySQL表(jos_fieldsattach_values)的一些數據,這使得我的大腦吸菸。mysql查詢未規範化的表中加入和子查詢

給定的表有以下結構,我無法改變:

id | articleid | fieldsid | value 

的表保存新聞的日期。 參見:http://sqlfiddle.com/#!2/8f9bf/1

目的是將每個新聞數據輸出爲未來五天內的對象或數組。關於這一點的難點在於表格沒有諸如「新聞日期」或「副標題」之類的字段,而是將所有內容保存在字段「值」中。我可以通過「fieldsid」的值來識別數據的類型。 F.e日期在(4,7,10)中將始終有一個fildsid,或者字幕在(14,15,16)中有字段,等等。這是極端不方便的,但正如我所說的,我無法更改表格結構或數據保存的方式。

我的第一步是讓具有內未來五天

SELECT 
    articleid 
FROM 
    `jos_fieldsattach_values` 
WHERE 
    value > NOW() and value < NOW() + INTERVAL 5 DAY 

輸出是新聞的文章:316,271,271

下一步是在那裏我有問題:

SELECT a.value,b.title, b.id FROM 
    jos_fieldsattach_values as a 
INNER JOIN 
    jos_content as b ON (a.articleid = b.id) 
WHERE a.articleid in (271,216) and a.fieldsid in (14,15,16) and value<>'' 

I'm與jos_content加入jos_fieldsattach_values進一步,我知道拿到文章標題從articleids有消息顯示我第一次查詢10 WHERE中的a.articleid(216,271)

我苦惱的是如何排序或查詢數據作爲對象。在僞碼:

WHERE 
    a.articleid in (271,216) // query rows with article ids only 
AND 
    a.fieldsid in (14,15,16) as subtitle // if fieldsid is X it has to be a subtitle 
AND 
    a.fieldsid in (4,7,10) as date // if fieldsid is Y it has to be a subtitle 

編輯:輸出將作爲二維陣列是有用的。類似:

Array 
(
[2013-08-09] => Array  // fieldsid in (4,7,10, …) 
    (
    [0] => News Title 1  // fieldsid in (1,2,3, …) 
    [1] => News Subtitle 1 // fieldsid in (14,15,16, …) 
    [2] => News Text 1  // fieldsid in (5,6,7, …) 
) 
[2013-08-08] => Array 
    (
    [0] => News Title 2 
    [1] => News Subtitle 2 
    [2] => News Text 2 
) 
[2013-08-07] => Array 
    (
    [0] => News Title 3 
    [1] => News Subtitle 3 
    [2] => News Text 3 
) 
) 

其中的日期的第一陣列和第二陣列具有數據標題。每個數組及其子數組具有相同的文章ID。

感謝每一個方法,

託尼

+0

什麼是您預期的輸出? – Aris

+0

當你描述領域Assn –

+0

嗨阿里斯和彼得,我編輯了問題,以顯示預期的輸出。這些字段從joomla第三方組件中保存下來,我無法更改;(謝謝,toni –

回答

0

好吧,也許不是最好的方式,但它的工作原理:

// Array for Field Date 
$dates = array("4", "7", "10"); 

// Array for Field Zusatz 
$zusatz = array("14", "15", "16"); 

// Array for Field Typ 
$types = array("5", "8", "11"); 

// Array for Field Beschreibungstext 
$desc = array("6", "9", "12"); 


$rows = array(); 


// FIll News Array with Data 

while ($row = mysql_fetch_array($result)) { 
// Filter for wrong date 
if ($row{'value'} !== "1970-01-01"){ 

// if field has date value 
if (in_array($row{'fieldtype'}, $dates)) { 
    $rows[$row{'value'}] = array(); 
    $datum = $row{'value'}; 
    $rows[$datum]["id"] = $row{'id'}; 
    $rows[$datum]["datum"] = $row{'value'}; 
    $rows[$datum]["title"] = $row{'title'}; 
    $rows[$datum]["alias"] = $row{'alias'};}; 

if (in_array($row{'fieldtype'}, $zusatz)) {$rows[$datum]["Untertitle"] = $row{'value'};}; // if field has Subtitle 
if (in_array($row{'fieldtype'}, $types)) {$rows[$datum]["Art"] = $row{'value'};} // if field has kind of value 
if (in_array($row{'fieldtype'}, $desc)) {$rows[$datum]["Beschreibung"] = $row{'value'};} // if field has descripton value 
} 

}