2009-04-09 5 views
0

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

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

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

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

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

Вышеупомянутый запрос работает, но проблема возникает, если я хочу ограничить набор результатов, чтобы сказать 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 с категорией, установленной для подделки.

+0

могли бы вы предоставить структуру аукциона и пользовательских таблиц? –

+0

Итак, держись, уникально ли имя пользователя? Вы говорите, что это не ПК в любой таблице, которая заставляет его звучать так, как будто могут быть дубликаты, поэтому, пока SELECT DISTINCT будет работать, наверняка это будет недействительным, если имя пользователя не уникально, потому что вы случайно опустите действительные записи ? – Kezzer

ответ

2

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

2

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

5

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

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

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

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

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

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

Update:

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

Update 2:

ли этот обратный запрос что-то?

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

Update 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 
+0

Да, я просто поставил это как комментарий к своему оригинальному сообщению. – Kezzer

+0

Я отредактировал мой вопрос, чтобы ответить на этот вопрос – 2009-04-09 10:37:29

+0

Я сделал еще одно обновление – 2009-04-09 11:01:22

0

Английский не является моим родным языком, но, если я правильно понимаю, вы хотите, чтобы выбрать всех пользователей (один раз), который имеет аукцион в данной категории х.

Я не уверен, что если этот синтаксис работает для 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 
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'