sql连接问题

时间:2009-04-09 10:02:09

标签: sql mysql

我有两张桌子,拍卖和用户。

我想从category = x的拍卖中选择用户名表,然后从users表中选择字段a,b和c,其中用户的用户名字段与拍卖中的用户名字段匹配。

我正在尝试这个:

SELECT AUCTIONS.USERNAME, USERS.firstname, USERS.lastname, USERS.flaggedauctions
FROM AUCTIONS
INNER JOIN USERS
ON AUCTIONS.USERNAME=USERS.USERNAME

这似乎有效。但是,USERNAME不是任何一个表中的主键,并且在拍卖表中可以有许多具有相同用户名的记录,因为在users表中每个用户名只有一条记录。

以上查询有效,但如果我想将结果集限制为10,则会出现问题。这可能导致返回10条记录,其中一些是重复记录。有没有办法在另一个查询中运行限制为每个姓氏1个记录的查询?

编辑:回答Quassnoi的帖子

用户名始终是唯一的

如果我有

Auctions:
    username    category    blah
    -------------------------------------
    user1       category1   tshirt
    user2       category2   jeans
    user3       category3   shoes
    user2       category3   belt
    user3       category3   pants

Users:
    username    firstname   lastname
    -------------------------------------
    user1       john        smith
    user2       fred        black
    user3       alice       brady

Then given category 3 as the category, I would want to show:

    username    firstname   lastname
    -------------------------------------
    user2       fred        black
    user3       alice       brady

With username coming from the auctions table.

Instead, at the moment this will display:

    username    firstname   lastname
    -------------------------------------
    user2       fred        black
    user3       alice       brady
    user3       alice       brady

EDIT2:

我正在使用

SELECT username, firstname, lastname
FROM USERS
WHERE username
IN (

SELECT USERNAME
FROM AUCTIONS
WHERE category = 'fake'
)
LIMIT 0 , 30

返回0结果。 AUCTIONS中肯定有很多记录,其类别设置为假。

5 个答案:

答案 0 :(得分:5)

我建议使用SELECT DISTINCT,但我宁愿问你这个问题:

鉴于表格:

AUCTION     USERNAME
--------    -------
Sotheby's   john
Christie's  john

USERNAME   FIRSTNAME LASTNAME
--------   --------  --------
john       John      Doe
john       John      Davis

,您希望为Sotheby's选择什么以及为Christie's选择什么?

除非你回答这个问题,否则无法理解“一种运行查询限制为每个用户名的记录的方式”是什么意思。

<强>更新

SELECT  *
FROM    users
WHERE   username IN
        (
        SELECT  username
        FROM    auctions
        WHERE   category = 'category3'
        )

更新2:

此查询是否会返回某些内容?

SELECT  u.username, u.firstname, u.lastname
FROM    auctions a, users u
WHERE   a.category = 'fake'
        AND u.username = a.username

更新3:

SELECT  ao.username, u.firstname, u.lastname
FROM    (
        SELECT  DISTINCT username
        FROM    auctions a
        WHERE   category = 'fake'
        ) ao
LEFT JOIN
        users u
ON      u.username = a.username

答案 1 :(得分:2)

使用SELECT DISTINCT代替SELECT

答案 2 :(得分:2)

如果我理解这一点,使用SELECT DISTINCT代替SELECT将解决您的问题

答案 3 :(得分:0)

英语不是我的母语,但如果我理解正确,您想要选择在给定类别x中进行拍卖的所有用户(一次)。

我不确定这种语法是否适用于MySQL,但尝试类似:

SELECT
    AUCTIONS.USERNAME,
    USERS.firstname,
    USERS.lastname,
    USERS.flaggedauctions
FROM
(
    SELECT DISTINCT 
        AUCTIONS.USERNAME
    FROM
        AUCTIONS
    WHERE
        AUCTIONS.CATEGORY = x
) AS AUCTIONS
INNER JOIN 
    USERS
ON 
    USERS.USERNAME = AUCTIONS.USERNAME

答案 4 :(得分:0)

您只需使用

即可
SELECT DISTINCT
    a.username,
    u.firstname,
    u.lastname
FROM 
    Users u
RIGHT JOIN
    Auctions a
    ON
    u.username = a.username
WHERE
    a.category = 'category3'