【问题标题】:How can I query data from 3+ tables connected that are connected with foreign keys?如何从与外键连接的 3 个以上连接的表中查询数据?
【发布时间】:2016-03-06 03:23:45
【问题描述】:

我有一个Search page,用户可以在其中根据特定条件进行搜索。我无法获得仅显示所需对象之一的查询权。这是我们的数据库设置:

CREATE TABLE Class
    (       
        cid int NOT NULL,
        classNum int,
        classDept varchar(20),
        PRIMARY KEY (cid)
    );

CREATE TABLE Book
    (
        bid int NOT NULL,
        cid int NOT NULL,
        title varchar(20) NOT NULL, 
        author varchar(20) NOT NULL,
        isbn varchar(13),
        price decimal(5,2) NOT NULL,
        PRIMARY KEY (bid),
        FOREIGN KEY (cid) REFERENCES Class (cid)
    );

CREATE TABLE Contact
    (
        contactID int NOT NULL,
        fname varchar(20),
        lname varchar(20),
        contactInfo varchar(90) NOT NULL,
        PRIMARY KEY (contactID)
    );

CREATE TABLE Post
    (
        pid int NOT NULL,
        contactID int NOT NULL,
        bid int NOT NULL,
        postDate date,
        PRIMARY KEY (pid),
        FOREIGN KEY (contactID) references Contact(contactID),
        FOREIGN KEY (bid) references Book(bid)
    );

这是我们用来尝试根据用户输入的条件进行查询的 php 代码。

$author = $_POST["author"];
     $title = $_POST["title"];
     $classNum = $_POST["number"];
     $classDept = $_POST["department"];
     $isbn = $_POST["isbn"];


     $query = "SELECT title, author, isbn, price, classNum, classDept, contactInfo
     FROM Book, Class, Contact, Post
     WHERE 
        Book.author='$author'
        OR Book.title='$title' 
        AND (SELECT Book.bid FROM Book, Contact WHERE Book.cid=Class.cid AND Contact.contactID=Post.ContactID AND Book.bid=Post.bid";
     $stid = oci_parse($conn,$query);
     oci_execute($stid,OCI_DEFAULT);

我们做错了什么?我们如何才能显示正确的搜索结果?

【问题讨论】:

  • 感谢您提供创建语句。现在您需要发布示例数据的插入语句并向我们展示所需的输出。

标签: php html sql oracle


【解决方案1】:

您的示例中有一些错误。首先,您将ANDs 和ORs 不带括号混合在一起,这可能会导致令人惊讶的结果。其次,您缺少外部查询中的连接子句,第三,您的子查询没有匹配的右括号。

这是一个我认为您可能想要完成的查询。注意我使用了 ANSI 连接语法。您可以将其切换为“Oracle”样式语法,它的工作方式完全相同。不过,我建议学习 ANSI 方式,因为这会使您可能需要的任何外连接更容易理解。

SELECT title, author, isbn, price, classNum, classDept, contactInfo
  FROM Book
  JOIN Class
    ON Class.cid = Book.cid
  JOIN Post
    ON Post.bid = Book.bid
  JOIN Contact
    ON Contact.contactID = Post.contactID
 WHERE Book.author = '$author'
    OR Book.title = '$title';

最后,要将作者或标题纳入查询,您应该研究查询参数。我对 PHP 没有经验,所以我无法建议如何继续使用此客户端。它应该是直截了当的。作为捷径,您可以将值直接连接到查询中。但是,不建议将这用于任何严肃的实际项目,因为您将容易受到SQL-injection attacks 的攻击。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2015-02-20
    相关资源
    最近更新 更多