Как сделать строки таблицы поиска в столбцах запроса? - PullRequest
2 голосов
/ 06 октября 2011

У меня есть три таблицы: у студентов, интересов и интереса у студентов есть cols student_id, а у имен интересов - cols Interest_id и интереса_имя_ интереса, есть cols student_id и интереса_id

.do

select interests.interest_name from `students`
  inner join `interest_lookup`
    on interest_lookup.student_id = students.student_id
  inner join `interests`
    on interests.interest_id = interest_lookup.interest_id

То, что я хочу сделать, это получить набор результатов, например

student_id | students.name | interest_a | interest_b | ...

, где имя столбца 'Interest_a' является значением в интересах. имя, а столбцы интереса_ равны 0или 1, такое, что значение равно 1, когда есть запись в Interest_lookup для данных student_id и интереса_id, и 0, если их нет.

Каждая запись в таблице интересов должна отображаться как имя столбца.

Я могу сделать это с помощью подвыборов (что очень медленно) или с помощью нескольких объединений, но оба они действительно требуют, чтобы я сначала выбрал все записи по интересам и записал динамический запрос.

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Вы делаете операцию, которая называется pivot.@ Slider345 ссылается (до редактирования своего ответа) на другой пост SO о том, как сделать это в Microsoft SQL Server.У Microsoft есть собственный специальный синтаксис для этого, но MySQL этого не делает.

Вы можете сделать что-то вроде этого:

SELECT s.student_id, s.name,
  SUM(i.name = 'a') AS interest_a,
  SUM(i.name = 'b') AS interest_b,
  SUM(i.name = 'c') AS interest_c
FROM students s
INNER JOIN interest_lookup l USING (student_id)
INNER JOIN interests i USING (interest_id)
GROUP BY s.student_id;

То, что вы не можете сделать в MySQLили Microsoft или что-то еще, автоматически заполняет столбцы, так что наличие данных увеличивает количество столбцов.

Столбцы запроса SQL должны быть фиксированными и жестко закодированы во время подготовки запроса.

Если вы не знаете список интересов накогда вы кодируете запрос или вам нужно его адаптировать к изменяющимся спискам интересов, вам придется извлекать интересы в виде строк и обрабатывать эти строки в приложении.

1 голос
/ 06 октября 2011

То, что вы пытаетесь сделать, звучит как опорный пункт.

Большинство решений, кажется, вращаются вокруг одного из следующих подходов:

0 голосов
/ 06 октября 2011

Я не думаю, что это возможно.На самом деле я думаю, что это просто вопрос представления данных.Я попытался бы использовать компонент для отображения данных, который позволил бы мне поворачивать данные (например, так же, как вы делаете это в Excel, открываете офисную калькуляцию и т. Д.).

Чтобы сделать это еще на один шаг вперед, вы должны еще раз подумать, зачем вам это нужно, и, вероятно, попытаться решить ее в приложении, а не в базе данных.

Я знаю, что это не очень помогает, но это лучшее, что я могу придумать: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...