Member 8580885 Ответов: 1

Vb.net форма для доступа к справке по запросу mysql


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

Столбцы: Код_формы | имя поля | значение поля |
Строки есть:

6 | epFname | Jack Doll
6 | epEmail | jdoll@mail.com
6 | epFname | Рон Янг
6 | epEmail | ryoung@mail.com

Я пытаюсь создать представление списка, которое извлекает данные в столбцы, заданные в представлении списка, но я не могу получить правильный запрос для извлечения данных, чтобы он правильно отображался в представлении списка следующим образом:

Столбцы ListView: FormId | Полное Имя | Адрес Электронной Почты
Данные ListView: 6 | кукла Jack | jdoll@mail.com
6 | Рон Янг | ryoung@mail.com

это мой ток vb.net код с использованием MySQL.Соединитель данных
=================================================================================


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sqlQuery As String = "SELECT (FormId), (FieldName), (FieldValue) FROM jos_rsform_submission_values WHERE FormId='6'"

        Dim sqlAdapter As New MySqlDataAdapter
        Dim sqlCommand As New MySqlCommand
        Dim Table As New DataTable
        Dim i As Integer

        lvList.Items.Clear()
        With (sqlCommand)
            .CommandText = sqlQuery
            .Connection = sConnection
        End With
        With sqlAdapter
            .SelectCommand = sqlCommand
            .Fill(Table)
        End With
        For i = 0 To Table.Rows.Count - 1
            With lvList
                .Items.Add(Table.Rows(i)("FormId"))
                With .Items(.Items.Count - 1).SubItems
                    .Add(Table.Rows(i)("FieldName"))
                    .Add(Table.Rows(i)("FieldValue"))
                End With
            End With
        Next
    End Sub

fjdiewornncalwe

Не могли бы вы сказать нам, что происходит не так? Мы не экстрасенсы.

Member 8580885

Я не знаю, как объяснить это лучше, если бы заголовки столбцов таблицы были Name, Email, FormId, то не было бы проблемы, но структура таблицы не такая

под Имяполя заголовок столбца-имя и адрес электронной почты, и под заголовке столбца значение поля имеет значения имя и адрес электронной почты.

Строка запроса-это то, что мне нужно исправить. это не правильно, но может дать вам идею:

Выберите Код_формы, Имяполя, значение поля из jos_rsform_submission_values где fieldname='имя' и fieldname='электронной почты'

И получает значения полей из этих строк таблицы

A_Griffin

На самом деле я думаю, что вам следует пересмотреть свой дизайн базы данных. Он и так не очень хорош, и вам будет трудно делать разумные запросы по нему.

Maciej Los

Вы уверены, что Формид-это то же самое для Джека Долла и Рона Янга?
Есть ли другие поля в вашей таблице?

1 Ответов

Рейтинг:
0

Maciej Los

Предполагая, что вы хотите преобразовать данные между нижеприведенными формами:




Исходные данные   Ожидаемый результат
FormId | FieldName | FieldValue
6      | epFname   | Jack Doll
6      | epEmail   | jdoll@mail.com
6      | epFname   | Ron Young
6      | epEmail   | ryoung@mail.com
 
FormId | FullName  | EmailAddress
6      | Jack Doll | jdoll@mail.com
6      | Ron Young | ryoung@mail.com


Вам нужно свернуть данные. Что это значит? Вы должны "конвертировать" уникальные данные из FieldName звук тише / громче в колонках. В псевдокоде:
[FullName] = If [FieldName]="epFname" Return [FieldValue] Else Nothig
[EmailAddres] = If [FieldName]="epEmail" Return [FieldValue] Else Nothig


В T-SQL вы можете достичь этого с помощью Случай, когда заявление[^] + ГРУППА ПО[^].

MySQL не знает Pivot и unpivot[^] операторы, как это хорошо известно в MS SQL. В MySQL вы должны создать представление. Видеть:
sql - MySQL - строки в Столбцы - переполнение стека[^]
Сводная таблица в MySQL – учебное пособие - Стратос блог[^]

Но! Вы не сможете достичь этого, потому что FormId то же самое относится и к именам, и к адресам электронной почты.


Чтобы обойти его, используйте следующий трюк:

SELECT t1.FormId, t1.[Index], t1.FullName, t2.EmailAddress
FROM (
    SELECT FormId, ROW_NUMBER() OVER w AS 'Index', FieldValue AS 'FullName'
    FROM YourTable
    WHERE FieldName ='epFname' AND FormId = 6
    WINDOW w AS (ORDER BY FormId)
) AS t1 INNER JOIN (
    SELECT FormId, ROW_NUMBER() OVER w AS 'Index', FieldValue AS 'EmailAddress'
    FROM YourTable
    WHERE FieldName ='epEmail' AND FormId = 6
    WINDOW w AS (ORDER BY FormId)) AS t2 ON t1.FormId = t2.FormId AND t1.Index =  t2.Index;

'original data becomes form database
'i need to create sample data, so...
Dim dt As DataTable = New DataTable()
dt.Columns.Add(New DataColumn("FormId", Type.GetType("System.Int32")))
dt.Columns.Add(New DataColumn("FieldName", Type.GetType("System.String")))
dt.Columns.Add(New DataColumn("FieldValue", Type.GetType("System.String")))
dt.Rows.Add(New Object(){6, "epFname", "Jack Doll"})
dt.Rows.Add(New Object(){6, "epEmail", "jdoll@mail.com"})
dt.Rows.Add(New Object(){6, "epFname", "Ron Young"})
dt.Rows.Add(New Object(){6, "epEmail", "ryoung@mail.com"})

'create another datatable to store pivoted data
Dim finalDt As DataTable = New DataTable()
finaldt.Columns.Add(New DataColumn("FormId", Type.GetType("System.Int32")))
finaldt.Columns.Add(New DataColumn("Index", Type.GetType("System.Int32")))
finaldt.Columns.Add(New DataColumn("FullName", Type.GetType("System.String")))
finaldt.Columns.Add(New DataColumn("EmailAddress", Type.GetType("System.String")))

'get data from original datatable
Dim data = (From a In dt.AsEnumerable() _
	.Where(Function(x) x.Field(Of String)("FieldName")="epFname") _
	.Select(Function(x, i) New With _
		{ _
			.FormId = x.Field(Of Integer)("FormId"), _
			.Index = i, _
			.FullName = x.Field(Of String)("FieldValue") _
		}).ToList() Join b In  dt.AsEnumerable() _
		.Where(Function(x) x.Field(Of String)("FieldName")="epEmail") _
		.Select(Function(x, i) New With _
			{ _
				.FormId = x.Field(Of Integer)("FormId"), _
				.Index = i, _
				.EmailAddress = x.Field(Of String)("FieldValue") _
			}).ToList() On a.FormId Equals b.FormId And a.Index Equals b.Index) _
		.Select(Function(joined) finaldt.LoadDataRow(New Object() _
			{ _
				joined.a.FormId, _
				joined.a.Index, _
				joined.a.FullName, _
				joined.b.EmailAddress _
			}, False)).ToList()

finaldt = data.CopyToDataTable()


Сейчас finaldt является ли хранение сводных данных:
FormId Index FullName   EmailAddress
6      0     Jack Doll  jdoll@mail.com 
6      1     Ron Young  ryoung@mail.com 


Больше:
MySQL :: MySQL 8.0 Справочное Руководство :: 12.19.1 Описание Оконных Функций[^]