【问题标题】:SQL/ PHP Joining table, ignoring multiple recordsSQL/PHP加入表,忽略多条记录
【发布时间】:2012-05-20 13:58:46
【问题描述】:

我什至不知道如何搜索这个问题的解决方案,没有找到任何具体的东西,所以这里......

我有四个表,让我们简化一下:

  players
  =======
  id    name    surname
  1     John    Arbuckle
  2     Walter  White
  3     Don Draper
  4     Louis   CK
  5     Tyrion  Lannister
  6     Abed    Nadir

  sports
  ======
  id    sport
  1     football
  2     handball

  positions
  =========
  id    name    sport_id
  1     goalie  1
  2     defense 1
  3     attack  1
  4     goalie  2
  5     pivot   2
  6     wing    2
  7     center  2

  player_position
  ===============
  player_id position_id
  1         1
  1         2
  1         5
  2         7
  2         5
  3         2
  4         2
  5         1
  5         3
  6         7
  6         5

因此,玩家可以在多个位置上进行多项运动。首先,我必须显示某项运动的球员名单,包括一个列有他们所打位置的列。

我从 JOIN 语句开始,我将在其中加入这些表并为每个玩家 ID 设置多行。这很接近,但不是很正确。我需要的是这样的表格:

足球

    ID  name    surname     position
    1   John    Arbuckle    PHP array(goalie,defense)

手球

    ID  name    surname     position
    1   John    Arbuckle    PHP array(pivot)

编辑: 所以我要找的是 GROUP_CONCAT()。 谢谢大家!

【问题讨论】:

  • 您查看过 GROUP_CONCAT 吗?
  • @MihaiStancu 这就是我要找的!谢谢! (是的,数据库是 MySQL)

标签: php sql join


【解决方案1】:
select p.id, p.name, p.surname, group_concat(po.name)
from players p 
inner join player_position pp on pp.player_id = p.id
inner join positions po on po.id = pp.position_id
inner join sports s on s.id = po.sport_id
where s.sport = 'football'
group by p.id

看到这个SQLFiddle example

【讨论】:

  • 谢谢! GROUP_CONCAT 是我要找的。​​span>
【解决方案2】:

足球:

SELECT players.name, players.surname, positions.name 
FROM players, sports, positions, player_position 
WHERE sports.id = 1 AND positions.sport_id = sports.id AND payer_position.position_id = positions.id AND players.id = player_position.player_id;

对于手球:

SELECT players.name, players.surname, positions.name 
FROM players, sports, positions, player_position 
WHERE sports.id = 2 AND positions.sport_id = sports.id AND payer_position.position_id = positions.id AND players.id = player_position.player_id;

【讨论】:

    【解决方案3】:

    我不确定这是否万无一失(未经测试),但是……

    SELECT pp.`player_id` AS 'ID',s.`id` AS 'sport_id',s.`sport`,ps.`name` AS 'position',pl.`name`,pl.`surname` FROM `sports` s
    INNER JOIN `positions` ps ON s.`id`=ps.`sport_id`
    INNER JOIN `player_position` pp ON pp.`position_id`=ps.`id`
    INNER JOIN `players` pl ON pl.`id`=pp.`player_id`
    ORDER BY s.`id`,pp.`player_id`,ps.`id`
    

    这里有一个更详细的版本:

    SELECT
        s.`id` AS 'sport_id',s.`sport`,
        ps.`id` AS 'position_id',ps.`name` AS 'position',
        pl.`id` AS 'player_id',pl.`name`,pl.`surname`
    FROM `sports` s
    INNER JOIN `positions` ps ON s.`id`=ps.`sport_id`
    INNER JOIN `player_position` pp ON pp.`position_id`=ps.`id`
    INNER JOIN `players` pl ON pl.`id`=pp.`player_id`
    ORDER BY s.`id`,pp.`player_id`,ps.`id`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多