0

たとえば、2つのテーブルがあります

ユーザー

----------------------------------
id  | name | blah
----------------------------------
1   | Samy | stackoverflow
2   | jhon | some thing
----------------------------------

スキル

---------------------------------------
id | user_id | skill_title | level
---------------------------------------
1  | 1       | php         | good
2  | 1       | css         | excellent
3  | 1       | photoshop   | fair
4  | 2       | php         | good
---------------------------------------

そして私はこのようなクエリを実行します

SELECT * FROM users 
INNER JOIN skills ON users.id = skills.user_id
WHERE ($skill_title[0] LIKE 'skills_title' AND 
       $skill_title[1] LIKE 'skills_title')

$kill_titleが配列である場合、必要なのは、このすべてのスキルを持つユーザーを選択することです。つまり、PHP、CSSは、上記のようにクエリを実行した場合、すべてのレコードをすべての配列要素と比較するため、データを取得しません。それは機能しますが、すべてのスキルを持つユーザーをもたらすわけではありません

何か案は ?

4

3 に答える 3

1

@joeshmoの答えはおそらくあなたの最善の解決策ですが、これも試してみる価値があるかもしれません. 大量のユーザーがいる場合は高速になる可能性がありますが、探しているスキルを持っているユーザーはほとんどいません。

SELECT * FROM users
WHERE
    id IN (SELECT user_id FROM skills WHERE skill_title = '$skills[0]')
    AND id IN (SELECT user_id FROM skills WHERE skill_title = '$skills[1]')
    ...

PHP スクリプトは次のようになります。

$skills = array("php", "css", ... ); // replace ... with the skills you are looking for
$whereClause = array();
for ($i=0, $count=count($skills); $i < $count; $i++)
    $whereClause[] = "id IN (SELECT user_id FROM skills WHERE skill_title = '{$skills[$i]}')";

$query = "SELECT * FROM users". (count($whereClause) > 0 ? " WHERE ". implode(" AND ", $whereClause) : "");


INNER JOIN@joeshmoが提案したように、 別の可能な解決策は、複数の を使用することです。これを行うことで、少し小さくきれいにすることができるかもしれません:

SELECT *
FROM
    users u
    INNER JOIN skills s1 ON u.id = s1.user_id AND s1.skill_title = '$skills[0]'
    INNER JOIN skills s2 ON u.id = s2.user_id AND s2.skill_title = '$skills[1]'
    ...

したがって、PHP スクリプトは次のようになります。

$skills = array("php", "css", ... );
$joins = array();
for ($i=0, $count=count($skills); $i < $count; $i++)
    $joins[] = "INNER JOIN skills s{$i} ON u.id = s{$i}.user_id AND s{$i}.skill_title = '{$skills[$i]}'";

$query = "SELECT * FROM users u ". implode(" ", $joins);

両方のソリューションを試して、データセットに対してどちらが優れているかを確認します。

于 2012-05-15T13:26:25.943 に答える
0
$skills = Array("php","css", ..... );
$query = "  select u.id, u.name from users u left join skills s on u.id=s.user_id "
        ."  where s.skill_title in (\"".implode($skills,"\",\"")."\") "
        ."  group by s.user_id having count(s.id) = ".count($skills);
于 2012-05-15T13:26:02.103 に答える
0

探しているスキルごとに、もう一度参加したいと思います。

SELECT * FROM users 
INNER JOIN skills as first_skill ON users.id = first_skill.user_id
INNER JOIN skills as second_skill ON users.id = second_skill.user_id
WHERE ($skill_title[0] LIKE first_skill.skill_title AND 
       $skill_title[1] LIKE second_skill.skill_title)

クエリの問題は、スキル テーブルに 1 回しか参加していないことです。クエリは次のように機能します。

-----------------------------------------------------
id  | name | blah           | skill_title | level
-----------------------------------------------------
1   | Samy | stackoverflow  | php         | good
1   | Samy | stackoverflow  | css         | excellent
1   | Samy | stackoverflow  | photoshop   | fair
2   | jhon | some thing     | php         | good
-----------------------------------------------------

css と php の両方を含む行はありません。私のクエリは次のように機能します。

----------------------------------------------------------------------------------------------------------------
id  | name | blah           | first_skill.skill_title | first_skill.level | second_skill.skill_title | second_skill.level |
----------------------------------------------------------------------------------------------------------------
1   | Samy | stackoverflow  | php                     | good              | php                      | good               |
1   | Samy | stackoverflow  | php                     | good              | css                      | excellent          |
1   | Samy | stackoverflow  | php                     | good              | photoshop                | fair               |
... (there would be nine for Samy)
2   | jhon | some thing     | php                     | good              | php                      
----------------------------------------------------------------------------------------------------------------

2 行目には と の両方がphpありcssます。そっちの方が似合います。

これは、最大 10 個のスキルにとっては面倒です。代わりに複数のクエリを実行できます。

于 2012-05-15T13:18:20.993 に答える