Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MYSQL:SELECT语句,多个WHERE's,从数据库填充_Php_Mysql_Select_Where - Fatal编程技术网

PHP/MYSQL:SELECT语句,多个WHERE's,从数据库填充

PHP/MYSQL:SELECT语句,多个WHERE's,从数据库填充,php,mysql,select,where,Php,Mysql,Select,Where,我试图找出如何让select语句由不断变化的where数填充。这适用于订单状态跟踪应用程序 基本上,想法是我们公司的用户客户登录,可以看到他/她的订单,检查状态等。没有问题。当该用户需要与多个公司关联时,就会出现问题。比如说他们工作或拥有两个不同的公司,或者他们为一家拥有多个子公司的公司工作,每个子公司单独订购,但大人物需要看到所有公司订购的所有东西。这就是我遇到问题的地方。我似乎想不出一个好办法来实现这一点。我唯一想到的是: 注意,前面代码中的客户机指的是用户的公司,因此我们的客户机 放在数据

我试图找出如何让select语句由不断变化的where数填充。这适用于订单状态跟踪应用程序

基本上,想法是我们公司的用户客户登录,可以看到他/她的订单,检查状态等。没有问题。当该用户需要与多个公司关联时,就会出现问题。比如说他们工作或拥有两个不同的公司,或者他们为一家拥有多个子公司的公司工作,每个子公司单独订购,但大人物需要看到所有公司订购的所有东西。这就是我遇到问题的地方。我似乎想不出一个好办法来实现这一点。我唯一想到的是:

注意,前面代码中的客户机指的是用户的公司,因此我们的客户机

放在数据库“我的用户”表中名为“公司”的列中。这就被称为:

问题是,虽然这样做有效,但我似乎无法使PHP加载项在client='and'和hidden='0'中正确运行。另外,这有点麻烦


有什么想法吗?提前谢谢

您可以使用IN关键字

client IN('client1','client2',...)

扩展Tim的答案,您可以使用和:

或者,您可以尝试:

联接是首选的方法。在其他原因中,它可能是最有效的,尽管你应该用它来测试。您可能不应该获取所有表列的信息。*以防以后更改表定义;我把它放进去是因为我不知道你想要哪一列

另一个不相关的注意事项是,研究对或驱动程序使用准备好的查询。当您多次执行查询时,准备好的查询效率更高,而且无需清理用户输入

关系方法涉及如下表:

CREATE TABLE mtc_users (
    username PRIMARY KEY,
    -- ... other user info
) ENGINE=InnoDB;

CREATE TABLE companies (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR() NOT NULL,
    -- ... other company info
) ENGINE=InnoDB;

CREATE TABLE co_members (
    username NOT NULL,
    company NOT NULL,
    FOREIGN KEY (`username`) REFERENCES mtc_users (`username`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (`company`) REFERENCES companies (`id`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    INDEX (`username`, `company`)
) ENGINE=InnoDB;

如果公司名称是唯一的,您可以将其用作主键,而不是id字段。co_成员是一个不好的名字,但员工和股东似乎不太合适。随着您对系统更加熟悉,您将能够想出一个更合适的名称。

这似乎不起作用。应该注意的是,它所比较的列在orders表中只有一个客户的名称。这样做的目的是向用户显示来自客户1、客户2和客户3的所有订单,依此类推。然而,我找不到一个mysql页面在中谈论,但它是一个非常流行的词…Doc for IN operator:company列中的公司应该如何在数据库中的mtc_用户中进行布局?该表应该包含usercompany关系,每个用户所属的公司都有一行。如果mtc_用户为每个用户保留用户属性1行,则创建一个新表并使用该表。在本例中,简化为一条SQL语句是一种方法。在其他情况下,可以使用内爆从序列生成字符串:client='。内爆'OR client=',分解',',$clientnames'和隐藏=0
client IN('client1','client2',...)
SELECT *columns* FROM info 
  WHERE hidden='0' AND client IN
  (   SELECT company FROM co_members 
        WHERE username=?
  )
  ORDER BY ...
SELECT info.* FROM info 
  JOIN co_members ON info.client = co_members.company
  WHERE co_members.username=?
    AND hidden='0'
  ORDER BY ...
CREATE TABLE mtc_users (
    username PRIMARY KEY,
    -- ... other user info
) ENGINE=InnoDB;

CREATE TABLE companies (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR() NOT NULL,
    -- ... other company info
) ENGINE=InnoDB;

CREATE TABLE co_members (
    username NOT NULL,
    company NOT NULL,
    FOREIGN KEY (`username`) REFERENCES mtc_users (`username`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (`company`) REFERENCES companies (`id`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    INDEX (`username`, `company`)
) ENGINE=InnoDB;