ユーザーのリストを作成しています。特定のフィールド (メールに一致、メールと種類に一致、名前と種類に一致、またはそれらすべてに一致) に一致するユーザー (およびアイテム) を返したいと考えています。重複ユーザーを減らしたいので、メールとタイプが一致する場合はメールを返さないでください。
サンプルデータ:
+----+---------------------+--------+---------+
| 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 つ、名前とタイプ用に 1 つ、すべてに 1 つです。最後に、php を使用して結果をフィルタリングします。
$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);
それらを置き換えるために1つのクエリを作成し、phpを使用したフィルタリングを回避する方法が必要だと思います。誰でも提案できますか?