2013-08-05 75 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 
} 

}