簡體   English   中英

多對多關系 select 和 order by

[英]Many-to-many relationship select and order by

我有兩個表之間的多對多關系:人和收藏夾。 我有三列:

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。

我如何檢索具有( favorite_id 1 和 2 在一起)的person_id並按具有更多is_main_favorite ='y'person id對結果進行排序,因此結果應為:

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')

可能類似於此:

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

順便說一句:您可能希望在數據庫中存儲 1/0 而不是 y/n,這樣您就不需要 IF 調用

解決方案

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表,每次都是它自己的表( onetwo )。 然后,檢查兩個favorite_id以查看它們是否存在。 如果它們都存在,則該行包含在結果集中,並按is_main_favorite的計數排序(如果有兩個“y”則為 2,如果有一個“y”則為 1,或 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM