我正在制作用户列表。我想返回匹配特定字段(匹配电子邮件、匹配电子邮件和类型、匹配名称和类型或匹配所有字段)的用户(和项目)。我想减少重复的用户,所以如果它与电子邮件和类型匹配,就不要返回电子邮件。
示例数据:
+----+---------------------+--------+---------+
| id | email | type | name |
+----+---------------------+--------+---------+
| 1 | rod@example.com | user | Rod |
| 2 | jane@example.com | user | Jane |
| 3 | rod2@example.com | user | Rod |
| 4 | rod3@example.com | admin | Rod |
| 5 | helen@example.com | admin | helen |
+----+---------------------+--------+---------+
所以如果 $email = 'rod@example.com', $type = 'user', $name = 'Rod' 我想返回以下结果。我想返回以下内容:
+----------------+----+
| matches | id |
+----------------+----+
| 3 (all) | 1 |
| 2 (name, type) | 3 |
| 1 (name) | 4 |
+----------------+----+
我正在考虑为每个匹配集单独的 sql 查询,1 个用于电子邮件,另一个用于电子邮件和类型,另一个用于名称和类型,1 个用于所有。最后使用 php.ini 过滤结果。
$users = array();
// match email
$sql = 'SELECT u.*, GROUP_CONCAT(i.name) as items
FROM users u
INNER JOIN items i
ON u.id = i.user_id
WHERE u.email = '.$email.'
GROUP BY u.id';
$users[] = mysqli_query($sql);
// match email & type
$sql = 'SELECT u.*, GROUP_CONCAT(i.name) as items
FROM users u
INNER JOIN items i
ON u.id = i.user_id
WHERE u.email = '.$email.' AND u.type = '.$type.'
GROUP BY u.id';
$users[] = mysqli_query($sql);
// match name & type
$sql = 'SELECT u.*, GROUP_CONCAT(i.name) as items
FROM users u
INNER JOIN items i
ON u.id = i.user_id
WHERE u.name = '.$name.' AND u.type = '.$type.'
GROUP BY u.id';
$users[] = mysqli_query($sql);
// match email, name & type
$sql = 'SELECT u.*, GROUP_CONCAT(i.name) as items
FROM users u
INNER JOIN items i
ON u.id = i.user_id
WHERE u.email = '.$email.' AND u.name = '.$name.' AND u.type = '.$type.'
GROUP BY u.id';
$users[] = mysqli_query($sql);
我觉得必须有一种方法可以创建一个查询来替换它们并避免使用 php 进行任何过滤。任何人都可以提供任何建议吗?