为什么此查询只选择一行?

时间:2010-03-22 12:00:04

标签: sql mysql

SELECT * FROM tbl_houses 
WHERE 
 (SELECT HousesList 
  FROM tbl_lists 
  WHERE tbl_lists.ID = '123') LIKE CONCAT('% ', tbl_houses.ID, '#')

它仅从tbl_houses内的最后一个tbl_houses.ID tbl_lists.HousesList中选择行

我需要它来选择tbl_houses中存在来自tbl_lists.HousesList的任何ID的所有行

2 个答案:

答案 0 :(得分:2)

如果不确切知道您的数据是什么样子很难说,但如果它只匹配最后一个ID,可能是因为您在字符串的末尾没有任何%,以便允许列表在比赛结束后继续。

答案 1 :(得分:0)

这是zeroth normal form中的数据库吗?我闻到了什么?

如果您有包含值列表的属性,例如HousesList属性,则应将其存储为distinct values in a separate relation

CREATE TABLE house (
    id VARCHAR NOT NULL,
    PRIMARY KEY (id)
    );

CREATE TABLE list (
    id VARCHAR NOT NULL,
    PRIMARY KEY (id),
    );

CREATE TABLE listitem (
    list_id VARCHAR NOT NULL,
        FOREIGN KEY list_id REFERENCES list (id),
    house_id VARCHAR NOT NULL,
        FOREIGN KEY house_id REFERENCES house (id),
    PRIMARY KEY (list_id, house_id)
    );

然后,您的不同房屋列表值每个都有自己的元组,并且可以像任何其他元素一样被选中。

SELECT house.*
FROM house
    JOIN listitem
        ON listitem.house_id = house.id
WHERE
    listitem.list_id = '123'