我正在试图找出如何使用不断变化的数字来填充select语句。这适用于订单状态跟踪应用程序。
基本上,这个想法是用户(我们公司的客户)登录,并且可以看到他/她的订单,检查状态等。没问题。当用户需要与多家公司关联时,就会出现问题。假设他们工作或拥有两家不同的公司,或者他们为一家拥有多家子公司的公司工作,每家公司都单独订购,但最重要的是需要查看所有公司订购的所有公司。这是我遇到问题的地方。我似乎无法找到实现这一目标的好方法。我唯一想到的是:
client='Client Name One' OR client='Client name two' AND hidden='0' OR client='Client name three' AND hidden='0' OR client='Client name four' AND hidden='0'
(请注意,以前代码中的客户端是指用户的公司,因此是我们的客户)
放在数据库的users表中名为company的列内。然后这样被调用:
$clientnamequery = "SELECT company FROM mtc_users WHERE username='testing'";
$clientnameresult = mysql_query($clientnamequery); list($clientname)=mysql_fetch_row($clientnameresult);
$query = "SELECT -redacted lots of column names- FROM info WHERE hidden='0' AND $clientname ORDER BY $col $dir";
$result = mysql_query($query);
事情是,虽然这有效但我似乎无法正确地在客户端='和'AND hidden ='0'中添加PHP。另外,它有点像kludgy。
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
扩展Tim的答案,您可以使用IN operator和subqueries:
SELECT *columns* FROM info
WHERE hidden='0' AND client IN
( SELECT company FROM co_members
WHERE username=?
)
ORDER BY ...
或者您可以尝试join:
SELECT info.* FROM info
JOIN co_members ON info.client = co_members.company
WHERE co_members.username=?
AND hidden='0'
ORDER BY ...
联接是首选方法。除了其他原因之外,它可能是最有效的(尽管你应该使用EXPLAIN SELECT ...
进行测试)。您可能不应该获取所有表列(info.*
),以防您以后更改表定义;我只是把它放进去,因为我不知道你想要哪些列。
在不相关的说明中,请考虑将准备好的查询与mysqli或PDO驱动程序一起使用。当您多次执行查询时,准备好的查询会更有效,并且无需清理用户输入。
关系方法涉及如下表:
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_members”是一个糟糕的名字,但“员工”和“股东”似乎并不是正确的术语。由于您对系统比较熟悉,因此您可以提供更合适的名称。
答案 1 :(得分:0)
您可以使用IN关键字
client IN('client1','client2',...)