Я действительно запутался в сводных таблицах, пожалуйста, посмотрите, что у меня есть и чего мне нужно достичь:
Это моя структура таблицы MySQL
id meta_value field_id item_id
1 Ankur Fname 1
2 Gupta Lname 1
3 AAS Holdings Company 1
4 Christie Fname 2
5 Trojillo Lname 2
6 AWS Company 2
7 Devadanam Fname 3
8 Pulukuri Lname 3
9 AAS Holdings Company 3
10 Radha Fname 4
11 Neupane Lname 4
......> There is no "Company" for that person
12 Marites Fname 5
13 Torsar Lname 5
14 AAS Holdings Company 5
15 Muthanna Fname 6
16 Shareef Lname 6
17 GFTC Company 6
Мне нужно быть в состоянии представить данные в таблице HTML, используя PHP MySQL таким образом
First Name Last Name Company
Ankur Gupta ASS Holdings
Christie Trojillo AWS
И мне также нужно иметь возможность сортировать эту таблицу по Компания например.
Вот то, что я пытался сделать, но я знаю, что это совершенно неправильно, потому что база данных может иметь только Fname и Lname без компании, что приведет к экранированию и использованию следующего значения и нарушению таблицы, а также данные могут храниться в другом порядке.
$sql="SELECT * FROM system_frm_item_metas ORDER BY item_id";
$result=mysqli_query($con,$sql);
if ($result->num_rows > 0) {
echo "<table><tr><th>First Name</th><th>Last Name</th><th>Company</th></tr>";
while($row = $result->fetch_assoc()) {
if ($row["field_id"] == "Fname") { echo "<tr><td>".$row["meta_value"]."</td>";}
if ($row["field_id"] == "Lname") { echo "<td>".$row["meta_value"]."</td>";}
if ($row["field_id"] == "Company") { echo "<td>".$row["meta_value"]."</td></tr>";}
}
echo "</table>";
Любая помощь будет по достоинству оценена
DROP TABLE IF EXISTS eav_hell;
CREATE TABLE eav_hell
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(30) NOT NULL
,PRIMARY KEY(entity,attribute)
);
INSERT INTO eav_hell VALUES
(1 ,'Fname','Ankur'),
(1 ,'Lname','Gupta'),
(1 ,'Company','AAS Holdings'),
(2 ,'Fname','Christie'),
(2 ,'Lname','Trojillo'),
(2 ,'Company','AWS'),
(3 ,'Fname','Devadanam'),
(3 ,'Lname','Pulukuri'),
(3 ,'Company','AAS Holdings'),
(4 ,'Fname','Radha'),
(4 ,'Lname','Neupane'),
(5 ,'Fname','Marites'),
(5 ,'Lname','Torsar'),
(5 ,'Company','AAS Holdings'),
(6 ,'Fname','Muthanna'),
(6 ,'Lname','Shareef'),
(6 ,'Company','GFTC');
SELECT entity
, MAX(CASE WHEN attribute = 'Fname' THEN value END) Fname
, MAX(CASE WHEN attribute = 'Lname' THEN value END) Lname
, MAX(CASE WHEN attribute = 'Company' THEN value END) Company
FROM eav_hell
GROUP
BY entity;
+--------+-----------+----------+--------------+
| entity | Fname | Lname | Company |
+--------+-----------+----------+--------------+
| 1 | Ankur | Gupta | AAS Holdings |
| 2 | Christie | Trojillo | AWS |
| 3 | Devadanam | Pulukuri | AAS Holdings |
| 4 | Radha | Neupane | NULL |
| 5 | Marites | Torsar | AAS Holdings |
| 6 | Muthanna | Shareef | GFTC |
+--------+-----------+----------+--------------+
или (быстрее, но менее элегантно) …
SELECT DISTINCT e.entity
, f.value fname
, l.value lname
, c.value company
FROM eav_hell e
LEFT
JOIN eav_hell f
ON f.entity = e.entity
AND f.attribute = 'fname'
LEFT
JOIN eav_hell l
ON l.entity = e.entity
AND l.attribute = 'lname'
LEFT
JOIN eav_hell c
ON c.entity = e.entity
AND c.attribute = 'company';
Других решений пока нет …