sql join вопрос - PullRequest
       20

sql join вопрос

0 голосов
/ 09 апреля 2009

У меня две таблицы, аукционы и пользователи.

Я хочу выбрать таблицу имен пользователей из аукционов, где категория = x, а затем выбрать поля a, b и c из таблицы пользователей, где поля имени пользователя в пользователях совпадают с полями имени пользователя аукционов.

Я пытаюсь это:

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

Что, кажется, работает. Однако USERNAME не является первичным ключом ни в одной из таблиц, и в таблице аукционов может быть много записей с одним и тем же именем пользователя, поскольку в таблице пользователей будет только одна запись на имя пользователя.

Вышеупомянутый запрос работает, но проблема возникает, если я хочу ограничить набор результатов, скажем, 10, для нумерации страниц. Это может привести к 10 возвращенным записям, некоторые из которых являются дубликатами. Есть ли способ выполнить запрос, ограниченный 1 записью на фамилию внутри другого запроса?

edit: в ответ на сообщение 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 результатов. В АУКЦИАХ, безусловно, есть много записей с категорией, установленной на подделку.

Ответы [ 5 ]

5 голосов
/ 09 апреля 2009

Я бы посоветовал использовать SELECT DISTINCT, но лучше задать вам этот вопрос:

Учитывая таблицы:

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

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

, что вы хотите выбрать для Sotheby's и для чего Christie's?

Невозможно понять, что вы подразумеваете под " способом выполнить запрос, ограничивающийся 1 записью на имя пользователя ", если вы не ответите на этот вопрос.

Обновление:

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
2 голосов
/ 09 апреля 2009

Если я правильно понял, использование SELECT DISTINCT вместо SELECT решит вашу проблему

2 голосов
/ 09 апреля 2009

Используйте SELECT DISTINCT вместо SELECT.

0 голосов
/ 09 апреля 2009

Вы можете просто использовать

SELECT DISTINCT
    a.username,
    u.firstname,
    u.lastname
FROM 
    Users u
RIGHT JOIN
    Auctions a
    ON
    u.username = a.username
WHERE
    a.category = 'category3'
0 голосов
/ 09 апреля 2009

Английский не является моим родным языком, но, если я правильно понимаю, вы хотите выбрать всех пользователей (один раз), которые проводят аукцион в данной категории 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...