【问题标题】:Database table not showing data after inner join内部联接后数据库表不显示数据
【发布时间】:2017-03-06 17:19:27
【问题描述】:

我有一个 C# windows 窗体应用程序,我也在使用数据库。 我有 3 张桌子:PlayersTournamentsTournamentsPlayers

我只会在表格中显示 2 个表格,TournamentsPlayers 表格。 Tournaments 表有一列是一个复选框,我想在 Players 表中仅显示我选中该框的锦标赛中的玩家。

当应用程序启动时,我有一个检查所有锦标赛的 foreach 语句,所以首先所有玩家都应该显示在 Players 表中,但没有显示任何玩家。

我的代码是:

private void ShowPlayersForSelectedTournaments()
        {
            string query =
                "SELECT a.Name, a.Id FROM Players a,TournamentPlayers b WHERE a.Id=b.TournamentId AND b.TournamentId=@TournamentId";
            using (Connection = new SqlConnection(ConnectionString))
            using (SqlCommand command = new SqlCommand(query, Connection))
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                foreach (DataGridViewRow row in TournamentsTable.Rows)
                {
                    if (row.Cells.Count > 0 && bool.Parse(row.Cells[0].Value.ToString()))
                    {
                        command.Parameters.AddWithValue("@TournamentId", row.Cells[1].Value);
                        DataTable tournamentPlayersList = new DataTable();
                        adapter.Fill(tournamentPlayersList);
                        PlayersTable.DataSource = tournamentPlayersList;
                        break;
                    }
                }
            }
        }

我尝试了一个简单的选择并且一切正常,但是使用这种 sql 语法似乎不起作用。 我尝试过另一种类似的 mysql 语法,例如:

string query = "SELECT a.Name FROM Players a INNER JOIN TournamentPlayers b ON a.Id=b.TournamentId WHERE b.TournamentId=@TournamentId";

Players 表中仍然没有显示任何内容。

我做错了什么?我的mysql语法或代码有问题吗?

【问题讨论】:

  • 添加适当的数据样本和预期结果
  • players.id = b.tournamentid 似乎不对,但您还没有显示您的确切数据库结构。
  • a.ID 是玩家的 id,您要将其与 TournamentID 相关联吗?

标签: c# mysql winforms sqlconnection


【解决方案1】:

这是您的查询:

SELECT a.Name, a.Id
FROM Players a,TournamentPlayers b
WHERE a.Id=b.TournamentId AND b.TournamentId=@TournamentId;

它有多个问题。这应该有效:

SELECT p.Name, p.Id
FROM Players p JOIN
     TournamentPlayers tp
     ON tp.playerId = p.id
 WHERE tp.TournamentId = @TournamentId;

注意事项:

  • 从不FROM 子句中使用逗号。 始终使用正确、明确的JOIN 语法。
  • 对表名使用缩写,这样查询在阅读时才有意义。
  • 修复表之间的连接条件,以匹配播放器。玩家具有与锦标赛相同的 ID 并且也参加过该锦标赛的可能性极小。可能,但不太可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2012-12-02
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2014-07-23
    相关资源
    最近更新 更多