根据以前的查询

时间:2016-04-21 11:20:08

标签: php mysql sql

我想在许多表上执行两个查询。第一个查询连接多个表并使用几个条件。它是这样的:

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放入临时表中。

非常感谢所有的贡献。 感谢

3 个答案:

答案 0 :(得分:2)

以下是两个选项:

  • 将第一个查询的结果存储在(临时)表中。然后在最终查询中使用此表。
  • 将第一个查询的结果存储在应用程序中,然后构造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}
              );

答案 1 :(得分:1)

我建议不要通过SQL进行第二次查询,而是通过PHP进行。执行完第一个查询后,您可以将所选信息保存到数组中:

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

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

此时,您将拥有一个数组,其中包含您执行第二次算法/查询/过滤/所需的信息。如果要将它放在另一个表中,则必须创建一个包含所有新列的新表,这有点繁琐。相反,你可以:

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

请告诉我这是否是您要找的!

答案 2 :(得分:0)

您必须设计我在查询中使用的ID's。您可以在此处使用PHP的join功能。

<强>查询

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