1

person と favorites という 2 つのテーブルの間に多対多の関係があります。私は3つの列を持っています:

person_id         int(8)
favorites_id      int(8)
is_main_favorite  enum('y','n')

なので:

person_id | favorite_id | is_main_favorite

2         | 1           |   'y'
2         | 2           |   'n'
3         | 1           |   'n'
3         | 2           |   'n'
1         | 1           |   'y'
1         | 2           |   'y'

PHPとMySQLを使用しています。

person_idhave ( favorite_id1 と 2 を一緒に) を取得しperson id、 have moreis_main_favorite ='y'で結果を並べ替える方法は次のとおりです。結果は次のようになります。

person_id 

1          (because he has favorite_id 1 and 2 and have two is_main_favorite = 'y')
2          (because he has favorite_id 1 and 2 and have one is_main_favorite = 'y')
4

3 に答える 3

1

おそらくこれに似たもの:

SELECT
    a.person_id
FROM
    table AS a,
    table AS b
WHERE
    a.person_id = b.person_id AND
    a.favorite_id = 1 AND
    b.favorite_id = 2
ORDER BY
    ( IF( a.is_main_favorite = "y", 1, 0 )
      +
      IF( b.is_main_favorite = "y", 1, 0 ) ) DESC

ところで: IF 呼び出しが不要になるように、y/n の代わりに 1/0 をデータベースに格納することもできます。

于 2012-04-07T18:10:16.633 に答える
0

解決

SELECT `person_id`
FROM `persons`
LEFT JOIN `favorites` AS `one`
 ON `favorites`.`person_id` = `persons`.`person_id`
LEFT JOIN `favorites` AS `two`
 ON `favorites`.`person_id` = `persons`.`person_id`
WHERE `one`.`favorite_id` = ?
AND `two`.`favorite_id` = ?
ORDER BY (
 IF(`one`.`is_main_favorite` = "y", 1, 0)
 +
 IF(`two`.`is_main_favorite` = "y", 1, 0)
) DESC

使い方

最初に、favoritesテーブルはpersonsテーブルに 2 回結合され、それぞれが独自のテーブルとして結合されます (oneおよびtwo)。次に、両方favorite_idの が存在するかどうかがチェックされます。両方が存在する場合、その行は結果セットに含まれ、is_main_favorite(2 つの "y" の場合は 2、1 つの "y" の場合は 1、または 0) の数で並べ替えられます。

于 2012-04-07T18:09:16.650 に答える
0
SELECT p.person_id
FROM person AS p, favorites AS f1, favorites AS f2
WHERE p.person_id = f1.person_id AND
      p.person_id = f2.person_id AND
      f1.favorite_id IS NOT NULL AND
      f2.favorite_id IS NOT NULL
ORDER BY
( IF( f1.is_main_favorite = "y", 1, 0 )
  +
  IF( f2.is_main_favorite = "y", 1, 0 ) ) DESC
于 2012-04-07T18:26:43.033 に答える