Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL Select语句中的动态列,保留;“未定义”;价值观_Mysql_Sql_Select_Mariadb - Fatal编程技术网

Mysql SQL Select语句中的动态列,保留;“未定义”;价值观

Mysql SQL Select语句中的动态列,保留;“未定义”;价值观,mysql,sql,select,mariadb,Mysql,Sql,Select,Mariadb,这是一个基于我的previos问题的新问题,该问题被标记为该问题的“副本” 这个问题看起来很相似,但有一个重要的部分是不同的 我尝试使用链接的解决方案,但Ansers不适合我的问题 我个人的SQL技能有限。在四处查看了几天之后,我没有找到任何解决下面数据库查询问题的有效方法。我在这个问题的末尾附上了完整的示例数据库SQL文本。 我的示例数据库(由MariaDB创建)包含两个表: 项目,及 itemproperties 对于每个项目,只定义一个项目.ID和一个项目.Name。(在实际示例中,

这是一个基于我的previos问题的新问题,该问题被标记为该问题的“副本”

这个问题看起来很相似,但有一个重要的部分是不同的 我尝试使用链接的解决方案,但Ansers不适合我的问题

我个人的SQL技能有限。在四处查看了几天之后,我没有找到任何解决下面数据库查询问题的有效方法。我在这个问题的末尾附上了完整的示例数据库SQL文本。 我的示例数据库(由MariaDB创建)包含两个表:

  • 项目,及
  • itemproperties
对于每个项目,只定义一个项目.ID和一个项目.Name。(在实际示例中,名称将被定义为唯一的。)

对于每个项目,都可以使用动态用户定义的属性集。这些属性定义为名称-值对。 例如,对于名为“Banana”的项目,可能存在值为“yellow”的属性“Color

一个项目只有一个“颜色”属性是有效的,因此不能为一个项目指定两种不同的颜色

(在我的实际问题中,属性名称仅包含两个字符,因此不需要额外的属性名称表,随后为了便于显示示例中未使用的问题)

items表的示例数据如下:

ID, Name
1,  Car
2,  House
3,  Homer
4,  Earth
并定义了上述项目共九个属性。条目“(NULL)”表示未为给定项定义此属性

ItemID, ItemName, Color,    Speed,  Price
1,      Car,      blue,       200,  50000
2,      House,    red,     (NULL), 250000
3,      Homer,    yellow,       5, (NULL)
4,      Earth,    blue,    108000, (NULL)
不幸的是,我的select语句

SELECT items.ID as ItemID, items.Name as ItemName,
CASE WHEN (itemproperties.Name = 'Color')
       THEN itemproperties.Value
       #ELSE NULL
END as Color,
CASE WHEN (itemproperties.Name = 'Speed')
       THEN itemproperties.Value
       #ELSE NULL
END as Speed,
CASE WHEN (itemproperties.Name = 'Price')
       THEN itemproperties.Value
       #ELSE NULL
END as Price
FROM items left join itemproperties 
ON  (items.ID=itemproperties.ItemID)
像这样返回数据

ItemID, ItemName, Color,   Speed, Price
1,      Car,      blue,   (NULL), (NULL)
1,      Car,      (NULL),  200,   (NULL)
1,      Car,      (NULL), (NULL), 50000
2,      House,    red,    (NULL), (NULL)
2,      House,    (NULL), (NULL), 250000
3,      Homer,    yellow, (NULL), (NULL)
3,      Homer,    (NULL),      5, (NULL)
4,      Earth,    blue,   (NULL), (NULL)
4,      Earth,    (NULL), 108000, (NULL)
问题:如何编写select语句以一种整理的形式获取tha数据,每项一行

根据上面的相关问题,我也尝试了以下方法

SELECT i.ID as ItemID, i.Name as ItemName, 
       p1.Value AS Color, p2.Value AS Speed, p3.Value AS Price
FROM items as i
JOIN itemproperties AS p1 ON (i.ID=p1.ItemID)
JOIN itemproperties AS p2 ON (i.ID=p2.ItemID)
JOIN itemproperties AS p3 ON (i.ID=p3.ItemID)
WHERE (p1.Name = 'Color') and (p2.Name = 'Speed') and (p3.Name = 'Price')
但结果只有一行:

ItemID, ItemName, Color, Speed, Price
1,      Car,      blue,    200, 50000
这种行为的原因是,只有“Car”项的三个属性“Color”、“Speed”和“Price”都填充了值。 跳过项目“House”,因为它有“颜色”和“价格”,但显然没有“速度”

那么如何以想要的方式得到桌子呢

你好,埃克哈德

数据库定义:

-- --------------------------------------------------------
-- Host:                         127.0.0.1
-- Server Version:               10.1.13-MariaDB - mariadb.org binary distribution
-- Server Betriebssystem:        Win32
-- HeidiSQL Version:             9.4.0.5125
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;


-- Exportiere Datenbank Struktur für DynamicColTest
CREATE DATABASE IF NOT EXISTS `dynamiccoltest` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `DynamicColTest`;

-- Exportiere Struktur von Tabelle DynamicColTest.itemproperties
CREATE TABLE IF NOT EXISTS `itemproperties` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique ID of the property',
  `ItemID` int(10) unsigned DEFAULT '0' COMMENT 'ID of the Item this property belongs to',
  `Name` varchar(20) DEFAULT '0' COMMENT 'Name of the property',
  `Value` varchar(20) DEFAULT '0' COMMENT 'Value of the property',
  UNIQUE KEY `Schlüssel 3` (`Name`,`ItemID`),
  KEY `Schlüssel 1` (`ID`),
  KEY `FK_itemproperties_items` (`ItemID`),
  CONSTRAINT `FK_itemproperties_items` FOREIGN KEY (`ItemID`) REFERENCES `items` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COMMENT='The properties of the items';

-- Exportiere Daten aus Tabelle DynamicColTest.itemproperties: ~9 rows (ungefähr)
DELETE FROM `itemproperties`;
/*!40000 ALTER TABLE `itemproperties` DISABLE KEYS */;
INSERT INTO `itemproperties` (`ID`, `ItemID`, `Name`, `Value`) VALUES
    (1, 1, 'Color', 'blue'),
    (1, 4, 'Color', 'blue'),
    (1, 2, 'Color', 'red'),
    (2, 3, 'Color', 'yellow'),
    (3, 1, 'Speed', '200'),
    (3, 4, 'Speed', '108000'),
    (4, 3, 'Speed', '5'),
    (5, 1, 'Price', '50000'),
    (5, 2, 'Price', '250000');
/*!40000 ALTER TABLE `itemproperties` ENABLE KEYS */;

-- Exportiere Struktur von Tabelle DynamicColTest.items
CREATE TABLE IF NOT EXISTS `items` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique Item ID',
  `Name` varchar(25) DEFAULT '0' COMMENT 'Name of the Item',
  KEY `Schlüssel 1` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COMMENT='Contains all Items, with a minimum of definitions';

-- Exportiere Daten aus Tabelle DynamicColTest.items: ~4 rows (ungefähr)
DELETE FROM `items`;
/*!40000 ALTER TABLE `items` DISABLE KEYS */;
INSERT INTO `items` (`ID`, `Name`) VALUES
    (1, 'Car'),
    (2, 'House'),
    (3, 'Homer'),
    (4, 'Earth');
/*!40000 ALTER TABLE `items` ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

下面的答案适用于
SQL SERVER
,但我希望它能对您有所帮助。我正在使用
PIVOT
函数来实现这个结果。您尤其可以使用类似的函数


你非常接近。您需要为每个需要检索的不同键(属性)加入一次键/值表
itemproperties
。问题是,您需要使用
左JOIN
。普通内部
JOIN
在未满足连接条件时抑制输出行

试试这个

SELECT i.ID as ItemID, i.Name as ItemName, 
       p1.Value AS Color, p2.Value AS Speed, p3.Value AS Price
  FROM items as i
  LEFT JOIN itemproperties AS p1 ON (i.ID=p1.ItemID) AND (p1.Name = 'Color')
  LEFT JOIN itemproperties AS p2 ON (i.ID=p2.ItemID) AND (p2.Name = 'Speed')
  LEFT JOIN itemproperties AS p3 ON (i.ID=p3.ItemID) AND (p3.Name = 'Price')

选择
Name
值的表达式(z.B.
p3.Name='Price'
)会出现在
ON
子句中,而不是出现在
WHERE
子句中。

@O.Jones这是谷歌快速搜索返回的结果。CTE将出现在MariaDB 10.2和MySQL 8.0.1中。但是
PIVOT
关键字不是。非常感谢,您的select语句确实很好!我确信需要“左连接”(正如我在第一种方法中看到的),但我真正错过的是
部分和(p1.Name='Color')
。现在我可以继续我真正的生活问题了。好吧,现在你有了一个副本。Ekkehard,请找出适合你的答案(我认为我的答案是最好的),然后将另一个标记为dup。(如果需要,请更具“声誉”的人去做)。
SELECT i.ID as ItemID, i.Name as ItemName, 
       p1.Value AS Color, p2.Value AS Speed, p3.Value AS Price
  FROM items as i
  LEFT JOIN itemproperties AS p1 ON (i.ID=p1.ItemID) AND (p1.Name = 'Color')
  LEFT JOIN itemproperties AS p2 ON (i.ID=p2.ItemID) AND (p2.Name = 'Speed')
  LEFT JOIN itemproperties AS p3 ON (i.ID=p3.ItemID) AND (p3.Name = 'Price')