【问题标题】:Can I join my 2 select queries into one?我可以将我的 2 个选择查询合二为一吗?
【发布时间】:2015-01-29 00:49:24
【问题描述】:

我有两张桌子:

任务:

id   title   description   client_id

客户:

id   name   phone   email   url 

当我在我的 PHP 应用程序中单击一个任务时,我会打开一个新页面,我还会在其中发送所单击任务的 ID。

要从我的表格中获取信息,我这样做:

$task_id = null;
if (! empty ( $_GET ['task_id'] )) {
    $task_id = $_GET ['task_id'];
}
if ($task_id == null) {
    die("This page can only be accessed by selecting a task");
}

$sql = "SELECT * FROM task WHERE id=:id";
$query = $db->prepare ( $sql );
$query->bindParam ( ":id", $task_id );
$query->execute ();
$task = $query->fetch ();

$client_id = $task ["client_id"];

$sql = "SELECT * FROM clients WHERE id=:client_id";
$query = $db->prepare ( $sql );
$query->bindParam ( ":client_id", $client_id );
$query->execute ();
$client = $query->fetch ();

所以,我的问题是,我可以使用一个 SELECT 而不是我现在的两个吗?

【问题讨论】:

    标签: php mysql sql pdo mysqli


    【解决方案1】:

    是的,您可以使用子查询,或者按照 Robby 的建议,使用联接。 子查询示例:

    $sql = "SELECT * FROM clients WHERE id = (SELECT client_id FROM task WHERE :task_id LIMIT 1)";
    $query = $db->prepare ( $sql );
    $query->bindParam ( ":task_id", $task_id );
    $query->execute ();
    $client = $query->fetch ();
    

    其中哪一个更合适可能取决于您的用例。如前所述,两者都可以解决您的问题。

    【讨论】:

    • 虽然不会返回任何任务数据,只会返回客户端数据。
    • 是的。我假设,也许是错误的,主要目标是获取客户端数据。如果他确实需要两者,那么您的解决方案会更可取,尽管如果是我,并且我需要两者,我会使用他的原始代码并在两个查询中执行操作,因为我认为这会使代码以后更易于阅读。
    【解决方案2】:

    当然可以,通过连接这两个表。查询如下所示:

    SELECT *
        FROM task
        LEFT JOIN clients
        ON task.client_id=clients.id
        WHERE task.id=:id
    

    或者在你的 PHP 中:

    $sql = "SELECT * FROM task LEFT JOIN clients ON task.client_id=clients.id WHERE task.id=:id";
    $query = $db->prepare ( $sql );
    $query->bindParam ( ":id", $task_id );
    $query->execute ();
    $task = $query->fetch ();
    

    【讨论】:

    • 哇,这很快。它正在工作。我会尽可能接受你的回答。
    猜你喜欢
    • 2017-07-09
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多