如何在MySQL中选择没有特定的一对多行的用户

时间:2016-03-02 11:44:25

标签: mysql

考虑以下数据集:

用户表:

SignUpActivity activity;

/**
 * Declaring Variables for Views
 */
TextView SignupAlreadyMember;

EditText SignUpName, SignUpEmail,referCode;
Button SignUpRegister;

VirtualApplication virtualApplication;

// Progress dialog
private ProgressDialog pDialog;


public SignUpFragment() {
}


@Override
public void onAttach(Activity activit) {
    super.onAttach(activit);
    this.activity = (SignUpActivity) activit;
    virtualApplication = (VirtualApplication) activity.getApplicationContext();


}

int bodyId;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        bodyId = getArguments().getInt("output");
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_sign_up, container, false);


       activity.setTempTitle("signup");
         inItViews(view);
    SignUpRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            RegisterUser();
            // showVerifyMobileScreen(123);

        }
    });
    SignUpEmail.setOnEditorActionListener(new EditText.OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId,
                                      KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                RegisterUser();
            }

            return false;
        }
    });

    SignupAlreadyMember.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            gotoLoginScreen();
        }
    });

    return view;
}

private void gotoLoginScreen() {

    Intent intent = new Intent(activity, LoginActivity.class);
    startActivity(intent);
    activity.finish();
}




public boolean validCellPhone(String number) {
    return Patterns.PHONE.matcher(number).matches();
}

private void RegisterUser() {

    String email = SignUpEmail.getText().toString().trim();
    String name = SignUpName.getText().toString().trim();
    String code=referCode.getText().toString().trim();

    if (email.isEmpty() ||!SystemUtil.isValidMobile(email)) {
        SignUpEmail.setError("Enter Mobile number here");
        return;
    }


    JSONObject jsonObject = new JSONObject();

    try {
        jsonObject.put("name", name);
        jsonObject.put("phone_number", email);
        jsonObject.put("body_id", bodyId);
        jsonObject.put("referral_code",code);//referral_code
        TelephonyManager tm = (TelephonyManager) activity
                .getSystemService(Context.TELEPHONY_SERVICE);
      jsonObject.put("imei", SystemUtil.getIMEINumber(activity, tm))  ;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    SignUpRegister.setEnabled(false);
    requestForRegistration(jsonObject);


}

private void requestForRegistration(JSONObject jsonObject) {
    showpDialog();
    RequestQueue requestQueue = CustomVolleyRequestQueue.getInstance(activity).getRequestQueue();
    final CustomJSONObjectRequest customJSONObjectRequest = new CustomJSONObjectRequest(Request.Method.POST, AppConstants.REGISTER_URL, jsonObject, this, this);
    customJSONObjectRequest.setTag("Register");
    customJSONObjectRequest.setRetryPolicy(new DefaultRetryPolicy(5000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    customJSONObjectRequest.setShouldCache(true);

    requestQueue.add(customJSONObjectRequest);
    //
}

private void showVerifyMobileScreen(int userId) {
    VerificationFragment verificationFragment = new VerificationFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("userId", userId);
    bundle.putString("mobile", SignUpEmail.getText().toString().trim());
    verificationFragment.setArguments(bundle);
    activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment, verificationFragment).commit();
}

private void inItViews(View view) {
    TextView SignUPHeader = (TextView) view.findViewById(R.id.SignUPHeader);
    TextView Signupmessage= (TextView) view.findViewById(R.id.Signupmessage);
    Signupmessage.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignUPHeader.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignupAlreadyMember = (TextView) view.findViewById(R.id.SignupAlreadyMember);
    SignupAlreadyMember.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignUpName = (EditText) view.findViewById(R.id.SignUpName);
    SignUpName.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignUpEmail = (EditText) view.findViewById(R.id.SignUpEmail);
    SignUpEmail.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignUpRegister = (Button) view.findViewById(R.id.SignUpRegister);
    SignUpRegister.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));

    referCode = (EditText) view.findViewById(R.id.referCode);
    referCode.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));


}

private void showpDialog() {
    pDialog = ProgressDialog.show(activity, null, null);
    final Drawable d = new ColorDrawable(Color.TRANSPARENT);
    pDialog.getWindow().setBackgroundDrawable(d);
    pDialog.setContentView(R.layout.loader);
    pDialog.show();
}

private void hidepDialog() {
    if (pDialog != null && pDialog.isShowing())
        pDialog.dismiss();
}


@Override
public void onErrorResponse(VolleyError volleyError) {
    hidepDialog();
    SignUpRegister.setEnabled(true);

}


@Override
public void onResponse(JSONObject jsonObject) {
    hidepDialog();

    SystemUtil.sysOut("register::::: " + jsonObject.toString());
    if (JSONUtil.readBoolean(jsonObject, "status")) {
        int userId = JSONUtil.readInt(jsonObject, "user_id");

        showVerifyMobileScreen(userId);
    }else{
        SignUpRegister.setEnabled(true);
    }


    if (jsonObject.has("message"))
        Toast.makeText(activity, JSONUtil.readString(jsonObject, "message"), Toast.LENGTH_LONG).show();


}

order_items表:

SignUpActivity activity;
TextView verifyTitleOne, verifyTitleTwo, verifyChnageNumber, verificationResend;
EditText SignUpMobile, VerficationCode;
Button VerificationRegister;
int userId;
String mobile;
boolean isResend;


public VerificationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    if (bundle != null) {
        userId = bundle.getInt("userId");
        mobile = bundle.getString("mobile");
    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_verfication, container, false);
    activity.setTempTitle("details");
    inItViews(view);
    SignUpMobile.setText("" + mobile);
    VerificationRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!VerficationCode.getText().toString().trim().isEmpty()) {
                Toast.makeText(activity, "Verifying", Toast.LENGTH_LONG).show();
                showpDialog();
                getDefaultData();

            } else {
                VerficationCode.setError("Enter Code");
            }
        }
    });

    verificationResend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!isResend) {
                isResend = true;
                JSONObject jsonObject = new JSONObject();
                try {
                    jsonObject.put("phone_number", mobile);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                requestServer(jsonObject, AppConstants.RESEND_OTP_URL);
            }else
                Toast.makeText(activity,"Please Wait",Toast.LENGTH_SHORT).show();
        }
    });
   // setvalues();
    return view;
}

private void setvalues() {
    VerficationCode.setText("51692");
    VerificationRegister.performClick();

}

private void getDefaultData() {
    JSONObject jsonObject = new JSONObject();

    try {
        jsonObject.put("user_id", userId);
        jsonObject.put("token", VerficationCode.getText().toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }

   requestServer(jsonObject,AppConstants.VERIFY_NUMBER_URL);

}

private void requestServer(JSONObject jsonObject, String url) {
    RequestQueue requestQueue = CustomVolleyRequestQueue.getInstance(activity).getRequestQueue();


    final CustomJSONObjectRequest customJSONObjectRequest = new CustomJSONObjectRequest(Request.Method.POST, url, jsonObject, this, this);
    customJSONObjectRequest.setTag("verify");
    requestQueue.add(customJSONObjectRequest);

}


private void gotoSelectSizesPage(JSONObject jsonObject) {
    Bundle bundle = new Bundle();
    bundle.putString("output", jsonObject.toString());
    DoneFragment homeKitFragment = new DoneFragment();
    homeKitFragment.setArguments(bundle);
    activity.setTempTitle("");
    activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment, homeKitFragment).commit();
}

private void inItViews(View view) {
    verifyTitleOne = (TextView) view.findViewById(R.id.verifyTitleOne);
    verifyTitleOne.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    verifyTitleTwo = (TextView) view.findViewById(R.id.verifyTitleTwo);
    verifyTitleTwo.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    verifyChnageNumber = (TextView) view.findViewById(R.id.verifyChnageNumber);
    verifyChnageNumber.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    verificationResend = (TextView) view.findViewById(R.id.verificationResend);
    verificationResend.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    SignUpMobile = (EditText) view.findViewById(R.id.SignUpMobile);
    SignUpMobile.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    VerficationCode = (EditText) view.findViewById(R.id.VerficationCode);
    VerficationCode.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
    VerificationRegister = (Button) view.findViewById(R.id.VerificationRegister);
    VerificationRegister.setTypeface(Typefaces.get(activity, AppConstants.FONT_ROBOT_REGULAR));
}


BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get("pdus");
            String smsMessageStr = "";
            for (int i = 0; i < sms.length; ++i) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i], "3gpp");

                smsMessageStr = smsMessage.getMessageBody().toString();
               // String address = smsMessage.getOriginatingAddress();

                /*smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";*/
            }
            VerficationCode.setText("" + stripNonDigits(smsMessageStr));

            VerificationRegister.performClick();

        }

    }
};


private ProgressDialog pDialog;

private void showpDialog() {
    pDialog = ProgressDialog.show(activity, null, null);
    final Drawable d = new ColorDrawable(Color.TRANSPARENT);
    pDialog.getWindow().setBackgroundDrawable(d);
    pDialog.setContentView(R.layout.loader);
    pDialog.show();
}

private void hidepDialog() {
    if (pDialog != null && pDialog.isShowing())
        pDialog.dismiss();
}


public static String stripNonDigits(
        final CharSequence input) {
    final StringBuilder sb = new StringBuilder(
            input.length());
    for (int i = 0; i < input.length(); i++) {
        final char c = input.charAt(i);
        if (c > 47 && c < 58) {
            sb.append(c);
        }
    }
    return sb.toString();
}


@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.activity = (SignUpActivity) activity;
    activity.registerReceiver(broadcastReceiver, new IntentFilter(
            AppConstants.BROADCAST_ACTION_SMS));
}

@Override
public void onDetach() {
    super.onDetach();
    activity.unregisterReceiver(broadcastReceiver);
}


@Override
public void onErrorResponse(VolleyError volleyError) {

    hidepDialog();
}

@Override
public void onResponse(JSONObject jsonObject) {
    hidepDialog();
    isResend=false;
    if (jsonObject.has("message"))
        Toast.makeText(activity, JSONUtil.readString(jsonObject, "message"), Toast.LENGTH_LONG).show();
    if (JSONUtil.readBoolean(jsonObject, "status") &&jsonObject.has("user_data")) {
        gotoSelectSizesPage(jsonObject);
    }
  }
}                       

更新问题

如何选择没有order_items且第16代生成且至少有一个order_item的用户?

所以:

id (int) email (string)
1        first@example.com
2        second@example.com

3 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS(),如下所示:

SELECT * FROM Users u
WHERE NOT EXISTS(SELECT 1 FROM order_items o
                 WHERE o.userid = u.id
                      AND o.generation = 16)

检查此用户的记录是否有order.generation = 16,如果没有,则选择他。

或不在()

SELECT * FROM Users u
WHERE u.id NOT IN(SELECT userid FROM order_items o
                  WHERE o.generation = 16)

选择具有order.generation = 16的用户列表,并选择除它们之外的每个ID。

答案 1 :(得分:1)

1)退货没有第16代订单商品的用户包括完全没有订单的用户。

假设order_items表中有某种id列:

select u.* from users u
left outer join order_items oi on (u.id = oi.user_id and oi.generation = 16)
where oi.id is null;

否则,在where条件中使用order_items中的任何主键为NULL。

已更新,以便在评论中包含问题的答案

2)返回没有第16代订单项但至少有一个订单的用户。

select distinct u.* from users u
left outer join order_items oi16 on (u.id = oi.user_id and oi.generation = 16)
join order_items oiother on (u.id = oiother.user_id and oiother.generation != 16)
where oi16.id is null;

我们使用第二个(普通)连接进行过滤,该连接仅返回从order_items表中找到匹配行的用户。

这里我们需要distinct,因为第二个连接将根据用户拥有的其他订单数乘以您的行。

或者你也可以像这样计算或计算:

select u.*, count(distinct oiother.id) from users u
left outer join order_items oi16 on (u.id = oi.user_id and oi.generation = 16)
join order_items oiother on (u.id = oiother.user_id and oiother.generation != 16)
where oi16.id is null
group by u.id;

这将为您提供每个返回用户有多少其他订单商品。或完全省略计数并使用group by返回不同的项目。

答案 2 :(得分:-2)

以下查询应该为您提供所需的输出:

*更新*

根据问题

中的新结果格式更改了查询

由于我们只想从生成表中获取数据,因此不再需要使用用户表连接。这是更新后的查询:

select id, generation
from mytable where id not in (
  select id from mytable
  where generation = 16
  group by id
  );

以下是SQL fiddle