【问题标题】:How can i query two different tables in mysql如何在mysql中查询两个不同的表
【发布时间】:2015-08-08 23:27:18
【问题描述】:

如何验证两个查询,如果第一个查询为 NULL,则继续进行第二个查询?

第一个查询:

 SELECT max(logs) as logs,id FROM table1 WHERE 
 message NOT LIKE "[ SYSTEM%"

第二次查询:

 SELECT max(logs) as logs,id FROM table2 WHERE 
 message LIKE "[ SYSTEM%"

【问题讨论】:

  • 您可以使用 mysqli_num_rows 来检查 no。第一次查询返回的行数。
  • 可能使用UNION 并使用外部SELECTLIMIT 1
  • if(!$result){//做某事}
  • @Sean 你能告诉我怎么做吗? :)
  • SELECT * FROM (SELECT max(logs) as logs,id FROM table1 WHERE message NOT LIKE "[ SYSTEM%" UNION SELECT max(logs) as logs,id FROM table2 WHERE message LIKE "[ SYSTEM%" ) LIMIT 1 - 这将返回 1 行,如果它不为 NULL,则为第一个查询。如果第一个查询为 NULL,它将返回第二个查询

标签: php mysql sql pdo


【解决方案1】:

我认为你应该看看你的解释。因为对 db 的计数查询更少 - 更好。在这种情况下,您应该使用联合:

SELECT max(logs) as logs, id, 'table1' type
FROM table1 WHERE message NOT LIKE "[ SYSTEM%"
UNION
SELECT max(logs) as logs, id, 'table2' type
FROM table2 WHERE message LIKE "[ SYSTEM%"
;

通过字段类型,您可以了解您从哪个表接收数据。
但如果你的解释不好,你应该使用单独的查询:

<?php

$dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'root');

$sth = $dbh->prepare('
    SELECT max(logs) as logs, id
    FROM table1 WHERE message NOT LIKE :like
');
$sth->bindParam(':like', $like, PDO::PARAM_STR);
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

if (empty($result)) {
    $sth = $dbh->prepare('
        SELECT max(logs) as logs, id
        FROM table2 WHERE message LIKE :like
    ');
    $sth->bindParam(':like', $like, PDO::PARAM_STR);
    $sth->execute();
    $result = $sth->fetchAll(PDO::FETCH_ASSOC);
}

var_export($result);

【讨论】:

    【解决方案2】:

    这个查询看起来很难看,但我认为你可以做到

    (SELECT max(logs) as logs,id
     FROM table1 
     WHERE message NOT LIKE "[ SYSTEM%")
    UNION ALL
    (SELECT max(logs) as logs,id
     FROM  table2
     WHERE message LIKE "[ SYSTEM%")
    

    您可以想象,如果只使用一个查询而不是两个查询,我们获取记录的速度有多快。

    您还可以在结果中添加标志(仅检查表 1 或表 2 中的记录)

    【讨论】:

    • 如何添加标志? :)
    • SELECT max(logs) as logs,id,'I AM TABLE 2' AS which_table FROM table2 ...你也应该为表 1 添加这个
    【解决方案3】:
       $query1 = "SELECT max(logs) as logs,id FROM table1 WHERE 
     message NOT LIKE '[ SYSTEM%'";
    $query2 = SELECT max(logs) as logs,id FROM table2 WHERE 
     message LIKE '[ SYSTEM%'";
    if(mysql_query($query1)) {
        $result = mysql_query($query1);
    } else {
       $result = mysql_query($query2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多