具有连接和子查询的非规范化表中的mysql查询

时间:2013-08-05 13:49:05

标签: mysql sql select

我想查询mysql表(jos_fieldsattach_values)表的一些数据,这会使我的大脑吸烟。

给定的表格具有以下结构,我无法改变:

id | articleid | fieldsid | value 

该表包含新闻日期。 请参阅:http://sqlfiddle.com/#!2/8f9bf/1

目的是将每个新闻数据输出为未来五天内的对象或数组。关于这一点的困难之处在于该表没有“新闻日期”或“副标题”之类的字段,而是将所有内容保存在字段“值”中。我可以通过“fieldsid”的值来识别数据类型。 F.e日期总是在(4,7,10)中有fildsid,或者字幕在(14,15,16)中有fieldids,依此类推。这绝对是不方便的,但正如我所说,我不能改变表结构或数据的保存方式。

我的第一步是在接下来的五天内获得有新闻的文章

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<>''

我正在使用jos_content加入jos_fieldsattach_values以获取文章标题我从第一个查询中知道哪些文章有新闻要显示     在(216,271)

中的a.articleid

我努力的方法是如何订购或查询数据作为对象。在伪代码中:

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
  )
) 

其中日期是第一个数组,第二个数组具有数据标题。每个Array及其子数组都具有相同的文章ID。

感谢每一种方法,

托尼

1 个答案:

答案 0 :(得分: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
}

}