У меня есть следующие таблицы:
Игроки в гольф:
| vID | vGolfer |
|-----|---------|
| 1 | Johnson |
| 2 | Thomas |
| 3 | Rahm |
| 4 | Spieth |
| 5 | Rose |
Состав:
| key | vPlayer | vID |
|-----|---------|-----|
| 1 | Player1 | 1 |
| 2 | Player1 | 2 |
| 3 | Player1 | 3 |
| 4 | Player1 | 4 |
| 5 | Player1 | 5 |
Где Roster.vID = Golfers.vID, и каждый игрок может выбрать 5 игроков в гольф, которые будут частью своего «списка».
Очки:
| key | vID | vRound | vScore |
|-----|-----|--------|--------|
| 1 | 1 | Rd1 | 71 |
| 2 | 1 | Rd2 | 70 |
| 3 | 1 | Rd3 | 71 |
| 4 | 1 | Rd4 | 69 |
где Scores.vID = Golfers.vID.
Моя цель - отобразить каждый «Ростер» в таблице на веб-странице со следующим выходом:
| Player1 | Rd1 | Rd2 | Rd3 | Rd4 |
|---------|-----|-----|-----|-----|
| Johnson | 71 | 68 | 72 | 69 |
| Spieth | 70 | 70 | 68 | 71 |
| Thomas | 72 | 71 | 71 | 70 |
| Rahm | 69 | 68 | 71 | 70 |
Я попытался использовать следующий запрос:
SELECT
g.vName,
(select vPlayer from vroster where vID = g.vID) as Player,
(select vScore from vscorecard where vID = g.vID and vRound='Rd1') as Round1
(select vScore from vscorecard where vID = g.vID and vRound='Rd2') as Round2
(select vScore from vscorecard where vID = g.vID and vRound='Rd3') as Round3
(select vScore from vscorecard where vID = g.vID and vRound='Rd4') as Round4
FROM vgolfers g
Однако я получаю код ошибки 1242. Подзапрос возвращает более 1 строки. Я понимаю, что пытаюсь получить несколько строк, где vPlayer = "Player1" и для каждого последующего игрока, но как мне это обойти?
Также я не вижу, как вы получаете этот набор результатов из этого набора данных.
@ Strawberry, я могу признать, что мой пост грубый и может принять обоснованную критику. Чего не хватает в вашей жизни, если вы публикуете ответ на это, не оставляя положительных отзывов? Если это уже не поможет, не беспокойтесь. Я сомневаюсь, что ты идеален со всем, что попробуешь с первого раза.






В ваших данных примера есть много ошибок:
key в качестве имени столбца. Я даже не знаю, как у вас получился такой стол, поэтому я использовал keyx, потому что это всего лишь пример. Найдите здесь зарезервированное слово ключ.Round1, Round2, Round3).Golfers против vgolfers; Scores против vscorecard и т. д.)g.vName не существует, но g.vGolfer существует.В любом случае...
Вы не указали оценки гольфистке по имени Роуз, поэтому я просто ввел 0 для их оценки.
Следующий запрос отобразит то, что вам нужно:
SELECT
g.vGolfer,
(select vPlayer from Roster where vID = g.vID) as Player,
(select vScore from Scores where vID = g.vID and vRound='Rd1') as Round1,
(select vScore from Scores where vID = g.vID and vRound='Rd2') as Round2,
(select vScore from Scores where vID = g.vID and vRound='Rd3') as Round3,
(select vScore from Scores where vID = g.vID and vRound='Rd4') as Round4
FROM Golfers g
Пожалуйста, взгляните на этот [ДЕМО]
РЕДАКТИРОВАТЬ: Если у вас есть дополнительные игроки:
SELECT
g.vGolfer,
r.vPlayer as Player,
MAX(CASE WHEN s.vround = 'Rd1' THEN s.vScore ELSE 0 END) AS Rd1,
MAX(CASE WHEN s.vround = 'Rd2' THEN s.vScore ELSE 0 END) AS Rd2,
MAX(CASE WHEN s.vround = 'Rd3' THEN s.vScore ELSE 0 END) AS Rd3,
MAX(CASE WHEN s.vround = 'Rd4' THEN s.vScore ELSE 0 END) AS Rd4
FROM Golfers g
INNER JOIN Roster r ON g.vID = r.vID
INNER JOIN Scores s ON g.vID = s.vID AND r.keyx = s.keyx
GROUP BY g.vGolfer, r.vPlayer
ORDER BY r.vPlayer, g.vGolfer
Я очень ценю помощь и прошу прощения за ужасный исходный пост. Это сработало отлично.
@ Взгляд, спасибо, и не беспокойтесь. Визуально ваш вопрос выглядел так, как будто все было хорошо, но затем, когда я начал пытаться связать таблицы вместе в своей голове, а затем сослался на вашу попытку, я был сбит с толку. Некоторые люди здесь могут решить такую проблему полностью в уме без тестирования, и они могут просто сказать, черт возьми, если тестовые данные тупые. Я же не могу решить многие из них, не проверив свою работу, ну да ладно. Некоторые из моих первых вопросов были ужасающими. (Сейчас мне трудно задать вопрос, на который я не могу найти ответ на этом сайте) в любом случае, ура.
Это отлично работает, когда есть только один «Player», если у меня несколько «Player», я получаю код ошибки 1242. Подзапрос возвращает более 1 строки.
@Speight - Сегодня вечером у меня больше нет времени, пожалуйста, ознакомьтесь с моим редактированием и ДЕМО. Я добавил больше данных и немного изменил запрос, используя МАКСИМУМ и ПРИСОЕДИНИТЬСЯ
select
g.vgolfer as player1,
max( case when s.vround = 'Rd1' then s.vscore else 0 end ) as Rd1,
max( case when s.vround = 'Rd2' then s.vscore else 0 end ) as Rd2,
max( case when s.vround = 'Rd3' then s.vscore else 0 end ) as Rd3,
max( case when s.vround = 'Rd4' then s.vscore else 0 end ) as Rd4
from scores s
inner join roster r
on s.vid = r.vid
inner join golfers g
on r.vid = g.vid
where r.vplayer = 'player1'
group by g.vgolfer
sqlfiddle - скопировал ненулевые тестовые данные из таблицы Брайена scores для проверки результатов теста.
Этот код, как показано ниже, может предоставить то, что вы хотите.
SELECT vGolfer Player1,
(SELECT vScore From Scores WHERE Golfers.vID = vID AND vRound = 'Rd1') Rd1,
(SELECT vScore From Scores WHERE Golfers.vID = vID AND vRound = 'Rd2') Rd2,
(SELECT vScore From Scores WHERE Golfers.vID = vID AND vRound = 'Rd3') Rd3,
(SELECT vScore From Scores WHERE Golfers.vID = vID AND vRound = 'Rd4') Rd4
FROM Golfers, Roster
WHERE Golfers.vID = Roster.vID and Roster.vPlayer = 'Player1'
Результат
Player1 Rd1 Rd2 Rd3 Rd4
Johnson 71 70 71 69
Thomas 72 71 71 70
Rahm 69 68 71 70
Spieth 70 70 68 71
Rose (null) (null) (null) (null)
Ваша запись о голосовании / принятии не самая лучшая, не так ли?