2016-04-21 64 views
1

我想对多个表执行两个查询。第一个查询连接多个表并使用多个条件。它是这样的:根据以前的查询执行选择查询

SELECT items.id, tableX.colA, tableY.colB ... 
FROM items 
    LEFT JOIN table2 ON ... 
    LEFT JOIN table3 ON ... 
    ... 
WHERE {some conditions are true} 

第二个查询是一个简单的查询,但取决于第一个结果。我想通过他们的ID选择与前一个查询相关的所有行。所以它应该是这样的

SELECT meta_name, meta_value FROM items_meta WHERE item IN ({LIST OF IDS FROM PREVIOUS QUERY}) 

这两个查询将用于不同的目的,因此他们不能合并成一个。

我一直在考虑将第一个查询的结果存储在临时表中,然后将第二个查询连接到它。但我似乎无法找到一种体面的方式来返回第一个查询的行并将ID放入临时表中。

所有贡献非常感谢。 谢谢

+0

你的ID必须用逗号(,) –

+0

加入只需使用JOIN – Strawberry

回答

0

你必须设计你的ID's就像我在查询中使用。您可以在这里使用PHP的join函数。

查询

SELECT meta_name, meta_value FROM items_meta WHERE item IN ('4', '8', '11') 
+0

是的,但这并不能帮助他做到这一点。这不仅仅是一个回答! – RiggsFolly

+0

正如他/她提到“第一个查询连接多个表”。所以我建议加入ID。 –

+0

感谢您的贡献。这是当前的实施。 join()函数不起作用,因为结果由多个列组成。所以我目前使用PHP的foreach()函数来形成ID列表。我在想,在不使用PHP的情况下,在SQL中执行此操作可能会有更合适的方法 – elSama

2

这里有两种选择:

  • Store中的(临时)表中的第一个查询的结果。然后在最终查询中使用此表。
  • 将第一个查询的结果存储在应用程序中,然后构造IN列表。

或者,只是用结合查询:

SELECT meta_name, meta_value 
FROM items_meta 
WHERE item IN (SELECT items.id 
       FROM table1 
        LEFT JOIN table2 ON ... 
        LEFT JOIN table3 ON ... 
        ... 
       WHERE {some conditions are true} 
      ); 
+0

先生,是'tableX.colA,tableY.colB ...'在这个目的不是问题? –

+0

...或者只是构建一个合适的查询 – Strawberry

+1

因此,这是*三个选项然后;) – MatBailie

1

我建议不要做通过SQL第二查询,但这样做在PHP。已经执行的第一个查询后,你会再选择的信息保存到一个数组:

//MySQL (PDO): 
$sql = "...";//your first SQL code 
$sqlPrepared = $conn->prepare($sql); 
$sqlPrepared->execute(); 

$rows = $sqlPrepared->fetchAll(PDO::FETCH_ASSOC); 

在这一点上,你将有你需要做你的第二个算法/查询/过滤器信息的阵列/不管HAHAH 。如果你把它放在另一个表中,你将不得不创建一个新表,其中所有新的列都比较单调乏味。相反,你可以:

$new_rows = array(); 
foreach ($rows as $row) 
{ 
    /*here you check if the row has the values you seek in the 'item' column 
    WHERE item IN ({LIST OF IDS FROM PREVIOUS QUERY})*/ 
    if (($row['item']== '4')||($row['item']== '10')||...) 
    { 
    array_push($new_rows, $row); 
    } 
} 

现在你有$ new_rows阵列,您可以使用的东西,如检查你所选择的信息:

print_r($new_rows); 

让我知道,如果这是你要找的人!

+0

我认为这种方法类似于@FrayneKanok提出的方法。这就是我将使用 – elSama

+0

@elSama很高兴我能帮上忙。如果您对如何实施它有任何疑问,请不要犹豫,在评论中发布一个问题:) – Webeng