MYSQL:如果没有找到任何记录然后默认值,如何基于id JOIN表

时间:2015-09-09 05:07:07

标签: mysql sql join

  

我想基于id或默认id加入两个表。

我有两张桌子用不同语言传播所有国家:

国家:

CREATE TABLE `country` (
  `ctry_id` smallint(7) unsigned NOT NULL AUTO_INCREMENT,
  `ctry_iso` varchar(2) DEFAULT NULL,
  PRIMARY KEY (`ctry_id`)
);

country_lang:

CREATE TABLE `country_lang` (
  `ctryl_ctry_id` smallint(7) unsigned NOT NULL,
  `ctryl_lang_id` smallint(5) unsigned NOT NULL DEFAULT '1',
  `ctryl_name` varchar(50) COLLATE utf32_unicode_ci NOT NULL,
  PRIMARY KEY (`ctryl_ctry_id`,`ctryl_lang_id`)
) ;

$ lang_id = 129;

SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id
 FROM country c
 LEFT JOIN country_lang cl on cl.ctryl_ctry_id = c.ctry_id AND ((cl.ctryl_lang_id= $lang_id AND cl.ctryl_lang_id) OR cl.ctryl_lang_id=1)
 ORDER BY c.ctry_iso ASC

我只想通过提供的lang_id获取记录连接,如果country_lang表中找不到记录国家/地区记录,则对应lang_id,然后按id返回。

4 个答案:

答案 0 :(得分:1)

也许以下内容更符合您的需求?

SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso, 
       c.ctry_iso3, c.ctry_flag, c.ctry_phone_code
 FROM country c
 LEFT JOIN country_lang cl on cl.ctryl_ctry_id = CASE 
   WHEN EXISTS(SELECT 1 FROM country_lang WHERE ctryl_ctry_id=ctry_id)
   THEN ctryl_ctry_id
   ELSE 1 END
 ORDER BY c.ctry_iso ASC

这将按照country - 记录完全返回一行行,并且 相应的语言ID 默认ID { {1}}。

或者,使用1,您也可以写

COALESCE()

(不可否认,我还没有理解,SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso, c.ctry_iso3, c.ctry_flag, c.ctry_phone_code FROM country c LEFT JOIN country_lang cl on cl.ctryl_ctry_id = COALESCE( (SELECT ctryl_ctry_id FROM country_lang WHERE ctryl_ctry_id=ctry_id),1) ORDER BY c.ctry_iso ASC 占有什么特别重要的意义,如果出现cl.ctryl_lang_id=129,你会想要什么样的行为。)

答案 1 :(得分:0)

你可以试试这个:

SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso, c.ctry_iso3, c.ctry_flag, c.ctry_phone_code
 FROM country c
 LEFT JOIN country_lang cl on cl.ctryl_ctry_id = c.ctry_id 
where (cl.ctryl_lang_id=129 AND cl.ctryl_lang_id=1)
ORDER BY c.ctry_iso ASC

答案 2 :(得分:0)

这个怎么样:

选择 c.ctry_id,cl.ctryl_name,cl.ctryl_lang_id,c.ctry_iso,c.ctry_iso3,c.ctry_flag,c.ctry_phone_code
来自国家c
LEFT JOIN country_lang cl
ON cl.ctryl_ctry_id = c.ctry_id
如果(EXITS(select * from country_lang where(country_lang.ctryl_lang_id = 129)),cl.ctryl_lang_id = 129,cl.ctryl_lang_id = 1)
ORDER BY c.ctry_iso ASC

答案 3 :(得分:0)

为我工作:

ALTER Proc [dbo].[HALAQATI_ttttttttttttt]
                @tf_commentparam nvarchar(100),
                @tf_secsuggdate int,
                @tf_testplace nvarchar(50),
                @tf_time nvarchar(7),
                @tf_day int,
                @an_id int,
                @ResponseText nvarchar(max) out,
                @ResponseNum int out -- (0 = everything is ok , 1 = error or wrong data)

AS
    DECLARE @startingTranCount int
    SET @startingTranCount = @@TRANCOUNT
Begin
SET XACT_ABORT ON
SET NoCount ON
    BEGIN TRY
    IF @startingTranCount > 0
        SAVE TRANSACTION mySavePointName
    ELSE
        BEGIN TRANSACTION

            DECLARE @return_value_FIRST int,
                @tf_id int,
                @createddate int,
                @UnitIDFromStudentID int,
                @StudentIDFromAutoNominationID int

            set @createddate  = (select dbo.f_getHijNowByInteger());

            set @StudentIDFromAutoNominationID = (select st_id from tbl_autonomination where an_id = @an_id);

            set @UnitIDFromStudentID =  (select sec_id from tbl_secmsq where sm_id = 
                                        (select sm_id from tbl_ring where rg_id = 
                                        (select Ring_ID from HALAQATI_VIEW_GetAllStudents where Student_ID = @StudentIDFromAutoNominationID)))
                                        --/////////////////////////////////--
            DECLARE @return_value_SECOND int,@msg nvarchar(500)

            Declare @BranchNumFromAnID int = (select ne_branchno from tbl_nomineeexam where an_id = @an_id)
                                        --/////////////////////////////////--
            DECLARE @return_value_THIRD int
                                        --/////////////////////////////////--

    EXEC        @return_value_FIRST = [dbo].[sp_inserttestform]
                @tf_comment = @tf_commentparam,
                @tf_date = @createddate,
                @tf_secsuggdate = @tf_secsuggdate,
                @tf_testplace = @tf_testplace,
                @tf_unittype = 1, -- قطاع
                @tf_unitid = @UnitIDFromStudentID,
                @tf_id = @tf_id OUTPUT,
                @tf_userid = 10,--رقم جلال سعيد في التعليمية,
                @tf_type = 1, --آلي
                @tf_time = @tf_time,
                @tf_day = @tf_day,
                @tf_TFtype = 1 -- أجزاء

                if (@return_value_FIRST != 0 and @tf_id is null)
                begin

                    if (@return_value_FIRST = 1)        
                        begin
                            set @ResponseText  =  'أقل من يوم وأكثر من 15 يوم' 
                            set @ResponseNum = 1
                            return
                        end
                    else if (@return_value_FIRST = 2)
                        begin
                            set @ResponseText = 'لايوجد نقاط كافية للترشيح'
                            set @ResponseNum = 1
                            return
                        end
                    else if (@return_value_FIRST = 3)
                        begin
                            set @ResponseText = 'لم يتم ربط مركز الإشراف أو المجمع بمشرف لجان'
                            set @ResponseNum = 1
                            return
                        end
                    else
                        begin
                            set @ResponseText =  'هناك خطأ حاول في وقت لاحق' 
                            set @ResponseNum = 1
                            return
                        end
                                IF @startingTranCount > 0
                            ROLLBACK TRANSACTION MySavePointName
                        ELSE
                            ROLLBACK
                End

    EXEC        @return_value_SECOND = [dbo].[sp_insertAutoNominee]
                @tf_id = @tf_id,
                @st_id = @StudentIDFromAutoNominationID,
                @an_id = @an_id,
                @ne_branchno = @BranchNumFromAnID,
                @ne_userid = 10,
                @msg = @msg OUTPUT

                if (@return_value_SECOND != 0 or @return_value_SECOND is not null)
                    begin
                         --ROLLBACK TRANSACTION

                         if CHARINDEX('بنفس الفرع ونتيجته ناجح',@msg) > 0
                            begin
                                set @ResponseText  = 'لا يمكن إضافة ترشيح للطالب لأن له ترشيح سابق بنفس الفرع ونتيجته ناجح أو لم يختبر بعد'
                                set @ResponseNum = 1
                                return
                            end              
                         if CHARINDEX('خلال السبعة أيام',@msg) > 0
                            begin
                                set @ResponseText  = 'لا يمكن إضافة ترشيح للطالب لأنه غاب عن اختبار في نفس الفرع خلال السبعة أيام الماضية'
                                set @ResponseNum = 1
                                return
                            end                      
                         if CHARINDEX('خلال الأربعة عشر يوماً',@msg) > 0
                            begin
                                set @ResponseText  = 'لا يمكن إضافة ترشيح للطالب لأنه رسب في نفس الاختبار خلال الأربعة عشر يوماً الماضية'
                                set @ResponseNum = 1
                                return
                            end             
                                IF @startingTranCount > 0
                            ROLLBACK TRANSACTION MySavePointName
                        ELSE
                            ROLLBACK                    
                    end

    EXEC        @return_value_THIRD = [dbo].[sp_changeTFState]
                @tf_state = 4,
                @tf_id = @tf_id,
                @tf_chatsys = NULL,
                @tf_testdate = @tf_secsuggdate,
                @tf_time = @tf_time,
                @tf_day = @tf_day,
                @ne_cerprintdate = NULL

                IF @startingTranCount = 0

                    set @ResponseText = 'تم إعتماد و ترشيح الطالب إلى الإختبار بنجاح , وتم إرسال كافة البيانات إلى قسم الإختبارات في الجمعية'
                    set @ResponseNum  = 0
                    COMMIT
    END TRY
    --BEGIN CATCH
    --IF @startingTranCount > 0
    --  ROLLBACK TRANSACTION MySavePointName
    --ELSE
    --  ROLLBACK TRANSACTION
    --  set @ResponseText = ERROR_MESSAGE ()   
    --  set @ResponseNum = 1
    --END CATCH  
       begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback
        if @xstate = 1 and @startingTranCount = 0
            rollback
        if @xstate = 1 and @startingTranCount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
    end catch   
End