如果是在mysql查询中

时间:2012-05-22 00:59:59

标签: mysql if-statement identifier

假设我想在表格中插入记录。每条记录都有一个ID(不是唯一的) 我想检查两列(比如名字和姓),如果这些列已经在我的表中,则使用该id,除非为新记录使用另一个id。
换句话说,我想说如果名称是新的,则分配一个新的ID,否则分配该记录的id。 (不要担心新的id,假设我有每个记录的原始id) 例如,假设我的表中有以下记录:

FirstName | LastName  | Location | Age ... | ID
John      | Smith     | Canada   | 12 ...  | 1234
John      | Smith     | US       | 21 ...  | 1234

现在我要添加另一个约翰史密斯。所以我想要新记录的相同ID。如果我想添加Paul Smith,我想要一个新的ID。

4 个答案:

答案 0 :(得分:2)

INSERT INTO YourTable (FirstName, LastName, Location, ID)
SELECT new.FirstName, new.LastName, new.Location, IFNULL(present.ID, new.ID)
FROM 
(SELECT 'John' AS FirstName
 , 'Smith' AS LastName
 , 'UK' AS Location
 , 1111 AS ID) AS new
LEFT OUTER JOIN YourTable AS present
ON present.FirstName = new.FirstName
AND present.LastName = new.LastName
ORDER BY present.ID DESC
LIMIT 1;

SQLFiddle

答案 1 :(得分:1)

您可以使用IFNULL获取当前值或使用新值,但缺少该值。

INSERT INTO your_table (id, first_name, last_name, other_stuff) VALUES (
    ( SELECT IFNULL (
        ( SELECT id FROM your_table WHERE first_name = 'John' AND last_name = 'Doe'),
        'new_id'
        ),
    ),
    'John',
    'Doe',
    'Your other data'
)

虽然我觉得你试图为每个名字/姓氏组合分配一个唯一的id。根据您的使用情况,可能有更好的方法(如果我是对的),请保持id< - >例如,在单独的表中进行名称映射,并且仅使用您在此帖子中引用的表中的id。

答案 2 :(得分:0)

INSERT .... ON DUPLICATE KEY UPDATE

您还可以为重复键指定不同的操作以满足您的需要。 我相信您要检查的字段需要编入索引才能正常工作。

希望有所帮助。

答案 3 :(得分:0)

CASE WHEN EXISTS (SELECT * FROM `names` WHERE `first`=$first AND `last`=$last) THEN (SELECT MAX(`id`) FROM `names` WHERE `first`=$first AND `last`=$last) ELSE $new_id

...是您问题的最接近的字面答案。但是,在您的情况下,这可能会更好:

IFNULL(SELECT MAX(`id`) FROM `names` WHERE `first`=$first AND `last`=$last, $new_id)

CASE WHEN是一个真正的if-then-else结构,而IFNULL(或等效地,COALESCE)只是在没有找到任何内容时提供默认值。