2011-08-31 31 views
1

我对某些mysql有点问题。我会尽力给予我很多背景。这就是情况,我为我父母的植物苗圃创建了一个可用的存储器,并将工厂信息存储在mysql中,我第一次做了一件可怕的工作,现在我正在用我在此期间获得的新知识重做它。MySQL IFNULL INSERT巨大的挫折?

背景的问题,我有2台旧数据库中的一个被称为Gallery具有以下字段:

idPlant_id_1Plant_id_2Plant_id_3Plant_id_4Plant_id_5Image1Image1_CopyrightImage2Image2_CopyrightScientificCommon,Category,Height, Spread, Exposure,Zone,Descp)。

Plant_id_1...领域将是被称为Availability具有以下字段的第二个表的id

idnamesizedescriptionavailableupcommingprice

所以你可以看到我对数据库一无所知(仍然不可能),但是对于表格的新结构,再次有两个表格第一个被称为plants,具有以下字段:

idscientific_namecommon_namecategoryheightspreadexposureusdadescriptionimage1_urlimage1_copyrightimage2_urlimage2_copyright

第二被称为current具有以下字段:

id,plant_id,size,available, upcomingpricedescription

plant_id将在plant表中的相应设备的ID。

现在解决问题。我需要从旧表中获取数据并将其放入新表中。我在新的plant表中没有画廊中的所有植物。但是现在将Availability放入Current表中。

这是从Availability出口为例(我把前3名):

INSERT INTO `Availability` (`id`, `name`, `size`, `description`,`available`, `upcomming`, `price`) VALUES(91, 'Acer P.''Shishigashira''', ' #5', '30-36"', 27, 0, 36.00); 

INSERT INTO `Availability` (`id`, `name`, `size`, `description`, `available`,`upcomming`, `price`) VALUES(697, 'Arbutus U. ''Compacta''', ' #5','', 0, 0, 16.20); 

INSERT INTO `Availability` (`id`, `name`, `size`, `description`, `available`, `upcomming`, `price`) VALUES(90, 'Acer P.''Shigitatsusawa''', '#15', '', 0, 0, 65.00); 

我需要从植物表plant_id并将它放入一个INSERT语句,我相信我有以下情况:

INSERT INTO `current` (`plant_id`, `size`,`description`, `available`, `upcoming`, `price`) VALUES(
(SELECT `id` 
FROM `plants` 
WHERE `scientific_name` 
REGEXP 'Acer P.+ ''Shishigashira'''), ' #5', '30-36"', 27, 0, 36.00); 

但现在我有一个新的问题,如果有什么在plant表匹配没有植物,所以我需要在那里IFNULL。以科学名称创建植物,其余为空。好,我是新来的SQL所以这是我已经和它不工作:

INSERT INTO `current` (`plant_id`, `size`,`description`, `available`, `upcoming`, `price`) VALUES(
(IFNULL(SELECT IFNULL((SELECT `id` 
FROM `plants` 
WHERE `scientific_name` 
REGEXP 'Chamaecyparis O.+ Nana'),( 
INSERT INTO `plants` (`scientific_name`) 
VALUES (Chamaecyparis O. 'Nana'))))), ' #1', '', 0, 0, 9.25); 

正如你可以看到它非常复杂,如果你认为你是最多的,帮助我,我会超越不胜感激的挑战。如果没有人能帮助我,我将不得不手动将所有数据重新输入到current表中。

+0

你的新工厂表中的id是否与旧库表中的id匹配?我有点失落,为什么你认为你必须根据科学名称进行搜索,以及由于您声明您复制了所有不同的植物,因此可能永远无法使用。那么突然间怎么会有未知的植物呢? – Eddy

+0

我希望,它会返回null的原因并不是所有可用的植物都在画廊中。所以我试图做的是在工厂画廊里创建那些缺失的植物。 – GerritVK

回答

0

您应该努力找到一个select,它将返回需要插入到新表中的数据。一旦 你有,你可以简单地把它包装成一个INSERT INTO - SELECT建筑。这样你就不必输出和做单独的插入。您可以简单地复制整个集合。

如果你确保当您从画廊复制厂进厂表中的ID保持不变我期待有一个选择这样应该返回的行要插入:

SELECT 
    Gallery.id as plant_id, 
    Availability.size, 
    Availability.available, 
    Availability.upcoming, 
    Availability.price, 
    Availability.description 
FROM Gallery 
INNER JOIN Availability 
ON Gallery.Plant_id1 = Availability.id 

然后,你可以做在这里你改变同样的事情5倍

ON Gallery.Plant_id1 = Availability.id 

至(一一)

ON Gallery.Plant_id2 = Availability.id 
ON Gallery.Plant_id3 = Availability.id 
ON Gallery.Plant_id4 = Availability.id 
ON Gallery.Plant_id5 = Availability.id 

或者你把它们全部放在一个巨大的SQL语句中,每个选择之间有一个UNION ALL

+0

尝试了你的建议,我收到了这个错误,我想我会得到你所得到的,但是从'gallery'到'plant'表的id不一样。 #1064 - 您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的“ON Gallery.Plant_id2 = Availability.id ON Gallery.Plant_id3 = Availability.id ON”在第11 – GerritVK

+0

正确的语法手册好吧,我看,所以我跑了你给我不得不改变。 ON Gallery.Plant_id1 = Availability.id ON ON Gallery.Plant_id_1 = Availability.id。请注意plant_id后的下划线。我明白你的建议,它会像你期望的那样返回,但是像我说的那样,ID不会保持不变。谢谢,现在我有另一条路要走了。我做一些更多的研究。 – GerritVK

+0

非常感谢你,我的问题得到解决。我非常认真地对你说了什么。我用原始ID重新导入植物数据库,然后运行上面的命令以获取我需要的数据,然后将其导出为csv并将其导入当前表中。非常感谢你。我已经花了3天时间了。 – GerritVK