MySQL 查询仅在两个表都有行时才返回结果

标签 mysql database multi-table

问题: 在我的 mysql 数据库中,我有两个表 listsshareslists 表包含用户创建的所有待办事项列表:

'lists' Table

shares 表存储已从一个用户共享给另一个用户的所有列表:

'shares' table

我想要做的是获取用户的所有列表,包括他们创建的列表以及他们有权访问的共享列表。目前,我有一个 select 语句,当共享表中有一个条目时,它可以完美地工作(如果它与我正在检索结果的特定用户相关,则无关紧要)。

一旦我从共享表中删除结果并尝试使用相同的多表 SELECT 语句,我就得不到任何结果,而且我不明白为什么。

这是我正在使用的 SELECT 语句:

SELECT DISTINCT `lists`.* FROM `lists`,`shares` WHERE `lists`.user_id = '$userid' OR (`shares`.sharedwith_id = '$userid' AND `lists`.id = `shares`.list_id) ORDER BY `lists`.datecreated DESC

任何有关查询的帮助都会很棒。我研究过 JOIN,但没有看到任何比我所拥有的更有效的东西。

最佳答案

您确实应该使用 JOIN 而不是 WHERE 子句:

SELECT DISTINCT `lists`.* 
FROM `lists`
LEFT JOIN `shares`
ON `lists`.`id`=`shares`.list_id AND `lists`.`user_id`=`shares`.`sharedwith_id`
WHERE `lists`.`id` = ?

最后,避免 SQL 注入(inject)攻击:切勿在 SQL 中嵌入参数。将您的参数作为参数传递。

关于MySQL 查询仅在两个表都有行时才返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596201/

相关文章:

php - 存储和排序图像

php - 尝试插入记录,除非值为 0

mysql - 如何建模一个页面可以有不同内容类型的数据库?

android - 如何在 Activeandroid 中禁用模型扫描

asp.net - 通过将 "userid"类型更改为整数来自定义 asp.net 成员资格

mysql - 我如何从 Solr 的数据导入器中迭代查询大型 MySQL 数据集?

php - 我的 PDO 事务没有提交,但也没有抛出任何异常

php - 来自现有数据库的随机图像

mysql - 将 3 个 MySQL 表合并到合并表中得到太多结果