При объединении 3 таблиц MySQL код ошибки 1242 возвращает более 1 строки

У меня есть следующие таблицы:

Игроки в гольф:

| 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 12.03.2018 01:06

Также я не вижу, как вы получаете этот набор результатов из этого набора данных.

Strawberry 12.03.2018 01:07

@ Strawberry, я могу признать, что мой пост грубый и может принять обоснованную критику. Чего не хватает в вашей жизни, если вы публикуете ответ на это, не оставляя положительных отзывов? Если это уже не поможет, не беспокойтесь. Я сомневаюсь, что ты идеален со всем, что попробуешь с первого раза.

Speight 12.03.2018 03:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В ваших данных примера есть много ошибок:

  1. Вы используете key в качестве имени столбца. Я даже не знаю, как у вас получился такой стол, поэтому я использовал keyx, потому что это всего лишь пример. Найдите здесь зарезервированное слово ключ.
  2. После каждого псевдонима отсутствуют запятые (Round1, Round2, Round3).
  3. Примеры имен таблиц - это не то, что вы используете в своем образце запроса (Golfers против vgolfers; Scores против vscorecard и т. д.)
  4. Столбец 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

[ОБНОВЛЕННАЯ ДЕМО]

Я очень ценю помощь и прошу прощения за ужасный исходный пост. Это сработало отлично.

Speight 12.03.2018 03:17

@ Взгляд, спасибо, и не беспокойтесь. Визуально ваш вопрос выглядел так, как будто все было хорошо, но затем, когда я начал пытаться связать таблицы вместе в своей голове, а затем сослался на вашу попытку, я был сбит с толку. Некоторые люди здесь могут решить такую ​​проблему полностью в уме без тестирования, и они могут просто сказать, черт возьми, если тестовые данные тупые. Я же не могу решить многие из них, не проверив свою работу, ну да ладно. Некоторые из моих первых вопросов были ужасающими. (Сейчас мне трудно задать вопрос, на который я не могу найти ответ на этом сайте) в любом случае, ура.

Brien Foss 12.03.2018 03:22

Это отлично работает, когда есть только один «Player», если у меня несколько «Player», я получаю код ошибки 1242. Подзапрос возвращает более 1 строки.

Speight 12.03.2018 04:16

@Speight - Сегодня вечером у меня больше нет времени, пожалуйста, ознакомьтесь с моим редактированием и ДЕМО. Я добавил больше данных и немного изменил запрос, используя МАКСИМУМ и ПРИСОЕДИНИТЬСЯ

Brien Foss 12.03.2018 04:58
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)

SQL Fiddle

Другие вопросы по теме