2014-10-03 2 views
0

// EDIT Нашел проблему. Я изменил весь тип текста на varchar. Теперь он работает нормально.SQL join on returns none values ​​

У меня есть таблица под названием "звуки", который выглядит так:

RowId типа INT (11) | userID тип текста | имя тип текст | звуковой файл тип текста
1 | "mod001: 02" | «Джимми» | "Музыка/Song.mp3"

и стол под названием "soundlist", который выглядит следующим образом:

soundID типа INT (11) | имя тип текст | звуковой файл тип текста | тип tinyint (1)
1 | "topSong" | "music/song.mp3" | 1

Моя проблема, когда я хочу запустить этот запрос

SELECT * 
FROM sounds 
INNER JOIN soundlist 
ON STRCMP(soundlist.soundfile, sounds.soundfile) = 0 
WHERE STRCMP(sounds.userID, "mod001:02") = 0; 

я получаю пустой результат!

Моя цель - установить «soundlist.used» на 0. У меня есть только «sounds.userID». настоящее время я использую этот запрос:

UPDATE soundlist 
INNER JOIN sounds 
ON STRCMP(sounds.userID, "mod001:02") = 0 
SET soundlist.used = 0 
WHERE STRCMP(soundlist.soundfile, sounds.soundfile) = 0; 
+0

Просто используйте обновление, если вы хотите изменить значения из одной таблицы ??? –

+2

Почему вы не присоединяетесь к rowid = soundid – Mihai

+0

Какую версию MySQL вы используете? – Mureinik

ответ

0

Отредактировано: Это обновит sounds.userid в "0", где soundlist.used является "1"

UPDATE sounds 
INNER JOIN soundlist ON 
    sounds.soundfile = soundlist.soundfile 
SET sounds.userid = "0" 
WHERE soundlist.used = "1" 

Если вместо этого вы хотите звуки .userid равного soundlist.us

UPDATE sounds 
INNER JOIN soundlist ON 
    sounds.soundfile = soundlist.soundfile 
SET sounds.userid = soundlist.used 
+0

но звуки не имеют поля "userid". –

0

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

UPDATE soundlist 
    set soundlist.used=0 
    where soundfile IN (    -- using IN keyword instead of = if you want to update multiple entries 
     select sounds.soundfile 
      from sounds 
      where sounds.rowID=1  -- or any other condition 
    ); 

Я предполагаю, что rowID является INT.

И если вы хотите пойти еще дальше и не беспокоить сравнение строк, почему бы не использовать внешние ключи?

Пусть звучит одинаково:

rowID | userID  | name | soundfile 
    1 | "mod001:02" | "Jimmy" | "music/song.mp3" 

И изменить звук список для ссылки звуки:

soundID | name  | soundId | used 
     1 | "topSong" | 1   | 1 

Ваш запрос:

SELECT * 
FROM sounds 
INNER JOIN soundlist 
ON STRCMP(soundlist.soundfile, sounds.soundfile) = 0 
WHERE STRCMP(sounds.userID, "mod001:02") = 0; 

станет

SELECT * 
FROM sounds s 
INNER JOIN soundlist l 
ON s.rowId=l.soundId 
where STRCMP(s.userID, "mod001:02") = 0; 

Это экономит один STRCMP.

Рассмотрите возможность использования индексов на VARCHAR столбцов, используемых для условий, это быстрее, а иногда легче читать запросы (s.userID = «mod001: 02» больше straigthforward)

0

Проблема заключается в том, что вы типа text данные , если я использую varchar первый запрос получает меня the desired result set